Changeset 319 in products
- Timestamp:
- Apr 12, 2006 3:24:08 PM (18 years ago)
- Location:
- SimpleBlog/branches/plone-2.1-Blogging-APIs
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
SimpleBlog/branches/plone-2.1-Blogging-APIs/Blog.py
r211 r319 6 6 import Permissions 7 7 from Products.CMFCore.utils import getToolByName 8 9 import MetaWeblogAPI 10 import BloggerAPI 11 import MovableTypeAPI 12 8 13 9 14 schema = BaseFolderSchema + Schema(( … … 96 101 condition="python:0", # this line have to be removed in order to be visible/editable 97 102 description="Enter administrator's email for receaving notification about blog's activity"), 98 ) 103 ), 104 BooleanField('allowDelicious', 105 default = 1, 106 accessor = 'isDeliciousEnabled', 107 schemata = 'interface', 108 widget=BooleanWidget(label="Turn Delicious bookmarklet", 109 label_msgid="label_allow_delicious", 110 description_msgid="help_allow_delicious"), 111 ), 112 BooleanField('allowDigg', 113 default = 1, 114 accessor = 'isDiggEnabled', 115 schemata = 'interface', 116 widget=BooleanWidget(label="Turn Digg bookmarklet", 117 label_msgid="label_allow_digg", 118 description_msgid="help_allow_digg"), 119 ), 120 BooleanField('allowYahoo', 121 default = 1, 122 accessor = 'isYahooEnabled', 123 schemata = 'interface', 124 widget=BooleanWidget(label="Turn Yahoo bookmarklet", 125 label_msgid="label_allow_yahoo", 126 description_msgid="help_allow_yahoo"), 127 ), 128 BooleanField('allowGoogle', 129 default = 1, 130 accessor = 'isGoogleEnabled', 131 schemata = 'interface', 132 widget=BooleanWidget(label="Turn Google bookmarklet", 133 label_msgid="label_allow_google", 134 description_msgid="help_allow_google"), 135 ), 136 BooleanField('allowSpurl', 137 default = 1, 138 accessor = 'isSpurlEnabled', 139 schemata = 'interface', 140 widget=BooleanWidget(label="Turn Spurl bookmarklet", 141 label_msgid="label_allow_spurl", 142 description_msgid="help_allow_spurl"), 143 ), 99 144 #BooleanField('allowComments', 100 145 # default = 1, … … 123 168 global_allow=1 124 169 schema=schema 170 171 blogger = None 172 metaWeblog = None 125 173 126 174 content_icon='simpleblog_icon.gif' … … 141 189 'visible':0}) 142 190 191 def initializeArchetype(self, **kwargs): 192 BaseFolder.initializeArchetype(self, **kwargs) 193 RPCAuth = self.simpleblog_tool.findRPCAuth(self) 194 195 # Setup the MetaWeblog API 196 self.metaWeblog = MetaWeblogAPI.MetaWeblogAPI().__of__(self) 197 self.metaWeblog.setupRPCAuth(RPCAuth) 198 199 # Setup the Blogger API 200 self.blogger = BloggerAPI.BloggerAPI().__of__(self) 201 self.blogger.setupRPCAuth(RPCAuth) 202 203 # Setup the MovableTypeAPI API 204 self.mt = MovableTypeAPI.MovableTypeAPI().__of__(self) 205 self.mt.setupRPCAuth(RPCAuth) 206 143 207 def manage_afterAdd(self, item, container): 144 208 BaseFolder.manage_afterAdd(self, item, container) … … 171 235 return val 172 236 237 def listCategories(self): 238 cats=self.getCategories() 239 240 # add the global categories 241 for c in self.simpleblog_tool.getGlobalCategories(): 242 if not c in cats: 243 cats.append(c) 244 cats = list(cats) 245 cats.sort() 246 return tuple(cats) 247 173 248 registerType(Blog) 174 249 -
SimpleBlog/branches/plone-2.1-Blogging-APIs/Extensions/Install.py
r211 r319 6 6 7 7 from Products.SimpleBlog.config import * 8 9 from Products.SimpleBlog import MetaWeblogAPI 10 from Products.SimpleBlog import BloggerAPI 11 from Products.SimpleBlog import MovableTypeAPI 8 12 9 13 portlets=['here/portlet_simpleblog/macros/portletBlogFull_local', … … 80 84 add_workflow(self, 'trackback_workflow', 'trackback_workflow (TrackBack Workflow)', ('TrackBack',), out) 81 85 wf_tool.setChainForPortalTypes( ('TrackBack'), 'trackback_workflow') 82 86 87 # Create an RPCAuth if there is not one already 88 installRPCAuth(self) 89 RPCAuth = self.simpleblog_tool.findRPCAuth(self) 90 91 # add the blogger object to the portal's root 92 # Setup the MetaWeblog API 93 portal.metaWeblog = MetaWeblogAPI.MetaWeblogAPI().__of__(self) 94 portal.metaWeblog.setupRPCAuth(RPCAuth) 95 96 # Setup the Blogger API 97 portal.blogger = BloggerAPI.BloggerAPI().__of__(self) 98 portal.blogger.setupRPCAuth(RPCAuth) 99 100 # Setup the MovableTypeAPI API 101 portal.mt = MovableTypeAPI.MovableTypeAPI().__of__(self) 102 portal.mt.setupRPCAuth(RPCAuth) 103 83 104 print >> out, "Successfully installed %s." % PROJECTNAME 84 105 return out.getvalue() … … 96 117 wf_tool.setChainForPortalTypes(types, wf_id) 97 118 out.write('Added workflow "%s"\n'%wf_id) 119 120 def installRPCAuth(self): 121 if not hasattr(self, 'RPCAuth'): 122 try: 123 self.manage_addProduct['RPCAuth'].manage_addRPCAuth('RPCAuth') 124 except: 125 raise "An RPCAuth instance could not be created. Please make sure RPCAuth is installed correctly." 98 126 99 127 -
SimpleBlog/branches/plone-2.1-Blogging-APIs/Extensions/utils.py
- Property svn:eol-style deleted
r28 r319 30 30 31 31 32 from Products.SimpleBlog import MetaWeblogAPI 33 from Products.SimpleBlog import BloggerAPI 34 from Products.SimpleBlog import MovableTypeAPI 32 35 33 #from Products.SimpleBlog import MetaWeblogAPI 34 #from Products.SimpleBlog import BloggerAPI 35 #from Products.SimpleBlog import MovableTypeAPI 36 37 #def migrateToAPIs(self): 38 #""" migrate existing SimpleBlog instance to support BloggingAPIs """ 39 #RPCAuth = self.simpleblog_tool.findRPCAuth(self) 40 ## Setup the MetaWeblog API 41 #self.metaWeblog = MetaWeblogAPI.MetaWeblogAPI().__of__(self) 42 #self.metaWeblog.setupRPCAuth(RPCAuth) 43 ## Setup the Blogger API 44 #self.blogger = BloggerAPI.BloggerAPI().__of__(self) 45 #self.blogger.setupRPCAuth(RPCAuth) 46 ## Setup the MovableTypeAPI API 47 #self.mt = MovableTypeAPI.MovableTypeAPI().__of__(self) 48 #self.mt.setupRPCAuth(RPCAuth) 36 def migrateToAPIs(self): 37 """ migrate existing SimpleBlog instance to support BloggingAPIs """ 38 RPCAuth = self.simpleblog_tool.findRPCAuth(self) 39 # Setup the MetaWeblog API 40 self.metaWeblog = MetaWeblogAPI.MetaWeblogAPI().__of__(self) 41 self.metaWeblog.setupRPCAuth(RPCAuth) 42 # Setup the Blogger API 43 self.blogger = BloggerAPI.BloggerAPI().__of__(self) 44 self.blogger.setupRPCAuth(RPCAuth) 45 # Setup the MovableTypeAPI API 46 self.mt = MovableTypeAPI.MovableTypeAPI().__of__(self) 47 self.mt.setupRPCAuth(RPCAuth) -
SimpleBlog/branches/plone-2.1-Blogging-APIs/SimpleBlogTool.py
- Property svn:eol-style deleted
r28 r319 18 18 meta_type= 'SimpleBlog manager' 19 19 plone_tool = 1 20 20 21 21 manage_options=PropertyManager.manage_options 22 22 23 23 security = ClassSecurityInfo() 24 24 calendar_types=['BlogEntry'] 25 25 use_session="" 26 26 27 27 def __init__(self): 28 28 self.manage_addProperty('publishedState', 'published', 'string') 29 29 self.manage_addProperty('maxItemsInPortlet', 5, 'int') 30 30 self.manage_addProperty('globalCategories', '', 'lines') 31 self.manage_addProperty('showStandardButtons', 1,'boolean') 31 32 self.manage_addProperty('createPortletOnBlogCreation', 1,'boolean') 33 self.manage_addProperty('showIcons', 1,'boolean') 32 34 33 35 security.declarePublic('getByUID') … … 47 49 return RPCAuth 48 50 parent = parent.aq_parent 49 return None 50 51 51 return None 52 52 53 security.declarePublic('idFromTitle') 53 54 def idFromTitle(self, title): 54 55 id = re.sub('[^A-Za-z0-9_]', '', re.sub(' ', '_', title)).lower() 55 return id 56 return id 56 57 57 58 def _getState(self): … … 76 77 except: 77 78 return [] 78 79 80 def _getShowStandardButtons(self): 81 try: 82 return self.showStandardButtons 83 except: 84 return 1 85 86 def _getShowIcons(self): 87 if not self.hasProperty('showIcons'): 88 self.manage_addProperty('showIcons', 1,'boolean') 89 try: 90 return self.showIcons 91 except: 92 return 1 93 79 94 def _getCreatePortletOnBlogCreation(self): 80 95 try: … … 84 99 85 100 security.declareProtected(CMFCorePermissions.ManagePortal,'setProperties') 86 def setProperties(self, publishedState='published', createPortletOnBlogCreation=None, maxItemsInPortlet=5, globalCategories='' ):101 def setProperties(self, publishedState='published', createPortletOnBlogCreation=None, maxItemsInPortlet=5, globalCategories='', showStandardButtons=1, showIcons=None): 87 102 self.publishedState = publishedState 88 103 if createPortletOnBlogCreation==1 or createPortletOnBlogCreation=='on': … … 91 106 self.createPortletOnBlogCreation=0 92 107 108 if showIcons==1 or showIcons=='on': 109 self.showIcons = 1 110 else: 111 self.showIcons = 0 112 93 113 self.maxItemsInPortlet=int(maxItemsInPortlet) 94 114 … … 100 120 101 121 self.globalCategories=value 102 122 self.showStandardButtons=int(showStandardButtons) 123 103 124 security.declarePublic('getPublishedState') 104 125 def getPublishedState(self): 105 126 return self._getState() 106 127 107 128 security.declarePublic('getMaxItemsInPortlet') 108 129 def getMaxItemsInPortlet(self): 109 130 return self._getMaxItemsInPortlet() 110 131 111 132 security.declarePublic('getFrontPage') 112 133 def getFrontPage(self, context): … … 126 147 break 127 148 parent=parent.aq_parent 128 149 129 150 if found==1: 130 151 return parent … … 133 154 else: 134 155 return context 135 security.declarePublic('getStartpointForSearch') 136 def getStartpointForSearch(self, context): 137 """ 138 When in the context of a blog, return the blog 139 Outside the context of a blog, return context or if context isn't 140 folderish, it's parent container 141 """ 142 plone_utils = getToolByName(context, 'plone_utils') 143 144 startpoint = self.getFrontPage(context) 145 if not startpoint: 146 # we weren't in the context of a blog 147 if plone_utils.isStructuralFolder(context): 148 return context 149 else: 150 return context.aq_parent 151 else: 152 return startpoint 153 156 154 157 security.declarePublic('getAvailableCategories') 155 def getAvailableCategories(self, context , startpoint=None):158 def getAvailableCategories(self, context): 156 159 """ 157 160 returns a dict of all the available categories with the number of posts inside … … 161 164 # if we are higher in the tree than any Blog then we will end up in the portalobject itself 162 165 # in that case we just search for categories starting in context. 163 if not startpoint: 164 startpoint = self.getStartpoint(context, fromHere=0) 165 categories = context.portal_catalog.uniqueValuesFor('EntryCategory') 166 path = self.getObjectPath(startpoint) 167 166 167 startpoint = self.getStartpoint(context, fromHere=0) 168 169 # now we have the starting point for our search 170 171 result = startpoint.portal_catalog.searchResults(meta_type=['BlogFolder', 'Blog'], path={'query':self.getObjectPath(startpoint),'level':0}) 172 173 # now fetch all the available categories 174 categories=[] 175 for o in result: 176 obj=o.getObject() 177 cats = obj.getCategories() 178 for c in cats: 179 if not c in categories: 180 categories.append(c) 181 182 # add the global categories 183 for c in self.getGlobalCategories(): 184 if not c in categories: 185 categories.append(c) 186 168 187 # now we have a list of unique categories available from startpoint and deeper in tree 169 188 # next step is to count the number of entries for each category 170 189 rescats={} 171 [rescats.update({c:0}) for c in categories] 172 result = startpoint.portal_catalog.searchResults(review_state=self._getState(), meta_type='BlogEntry', path={'query':path,'level':0}) 173 174 for r in result: 175 for c in r.EntryCategory: rescats[c] = rescats[c]+1 176 for c,n in rescats.items(): 177 if n==0: del rescats[c] 178 return rescats 179 190 for c in categories: 191 result = startpoint.portal_catalog.searchResults(review_state=self._getState(), meta_type='BlogEntry', EntryCategory=c, path={'query':self.getObjectPath(startpoint),'level':0}) 192 rescats[c]=len(result) 193 return rescats 194 180 195 security.declarePublic('getSortedKeys') 181 196 def getSortedKeys(self, dict): … … 183 198 keys.sort() 184 199 return keys 185 200 186 201 security.declarePublic('getGlobalCategories') 187 202 def getGlobalCategories(self): 188 203 return self._getGlobalCategories() 189 190 security.declarePublic(' getStartpoint')204 205 security.declarePublic('searchForEntries') 191 206 def getStartpoint(self, context, fromHere=0): 192 207 if context.portal_type!='Blog' and fromHere==0: … … 202 217 break 203 218 parent=parent.aq_parent 204 219 205 220 if found==1: 206 221 startpoint=parent … … 214 229 215 230 return startpoint 216 231 217 232 security.declarePublic('searchForEntries') 218 def searchForEntries(self, context, category=None, maxResults=None, fromHere=0 , filterState=1, **kwargs):233 def searchForEntries(self, context, category=None, maxResults=None, fromHere=0): 219 234 # set maxResults=0 for all the results, 220 235 # leave it to None to get the max from the properties 221 236 # set fromHere=1 to search from the current location. Is used for BlogFolders 222 237 223 238 # first, get the context right 224 239 # when inside a Blog: search for the frontpage 225 240 # when outside a Blog: use context (or its container) 226 227 #filterState controls whether you want to return only published entries 228 241 229 242 startpoint = self.getStartpoint(context, fromHere) 230 query=kwargs 231 publishedState = self._getState() 243 # now we have the starting point for our search 244 245 query={} 246 232 247 if category!=None: 233 248 query['EntryCategory']=category 234 235 if filterState: 236 query['review_state']=publishedState 237 238 results = startpoint.portal_catalog.searchResults(query, meta_type='BlogEntry', 239 path={'query':self.getObjectPath(startpoint),'level':0}, sort_order='reverse', 240 sort_on='effective', sort_limit=maxResults and maxResults or None) 241 242 if maxResults==0: 249 250 query['getAlwaysOnTop']=1 251 resultsTop = startpoint.portal_catalog.searchResults(query, review_state=self._getState(), meta_type='BlogEntry', path={'query':self.getObjectPath(startpoint),'level':0}, sort_order='reverse', sort_on='effective') 252 253 query['getAlwaysOnTop']=0 254 resultsNoTop = startpoint.portal_catalog.searchResults(query, review_state=self._getState(), meta_type='BlogEntry', path={'query':self.getObjectPath(startpoint),'level':0}, sort_order='reverse', sort_on='effective') 255 256 results = resultsTop + resultsNoTop 257 258 259 if maxResults==0: 243 260 return results 244 261 elif maxResults==None: … … 246 263 else: 247 264 return results[:maxResults] 248 249 265 250 266 security.declarePublic('searchForDay') … … 252 268 startpoint = self.getStartpoint(context, fromHere=0) 253 269 # now we have the starting point for our search 254 255 query={'start': DateTime(date).earliestTime(), 'start_usage': 'range:min', 270 271 query={'start': DateTime(date).earliestTime(), 'start_usage': 'range:min', 256 272 'end': DateTime(date).latestTime(), 'end_usage':'range:max'} 257 273 query['getAlwaysOnTop']=1 258 resultsTop = startpoint.portal_catalog.searchResults(query, 259 review_state=self._getState(), 260 meta_type='BlogEntry', 261 path={'query':self.getObjectPath(startpoint),'level':0}, 274 resultsTop = startpoint.portal_catalog.searchResults(query, 275 review_state=self._getState(), 276 meta_type='BlogEntry', 277 path={'query':self.getObjectPath(startpoint),'level':0}, 262 278 sort_order='reverse', sort_on='effective') 279 280 263 281 query['getAlwaysOnTop']=0 264 resultsNoTop = startpoint.portal_catalog.searchResults(query, 265 review_state=self._getState(), 266 meta_type='BlogEntry', 267 path={'query':self.getObjectPath(startpoint),'level':0}, 282 resultsNoTop = startpoint.portal_catalog.searchResults(query, 283 review_state=self._getState(), 284 meta_type='BlogEntry', 285 path={'query':self.getObjectPath(startpoint),'level':0}, 268 286 sort_order='reverse', sort_on='effective') 287 269 288 results = resultsTop + resultsNoTop 270 289 return results 271 272 security.declarePublic('getUnpublishedEntries') 273 def getUnpublishedEntries(self, blog): 274 states = self. getEntryWorkflowStates(blog) 275 pubstate = self.getPublishedState() 276 states = [s for s in states if s!=pubstate] 277 query={'review_state':states} 278 entries = self.searchForEntries(blog, filterState=0, maxResults=0, fromHere=1, **query) 279 return entries 280 290 281 291 security.declarePublic('blogHasEntries') 282 292 def blogHasEntries(self, context, fromHere=0): … … 287 297 """ 288 298 startpoint = self.getStartpoint(context, fromHere=0) 289 299 290 300 # get all entries, doesn't matter what state they're in 291 301 results = startpoint.portal_catalog.searchResults(meta_type='BlogEntry', path={'query':self.getObjectPath(startpoint),'level':0}) 292 302 293 303 if results: 294 304 return True … … 303 313 return context.EffectiveDate() 304 314 315 security.declarePublic('getShowStandardButtons') 316 def getShowStandardButtons(self): 317 return self._getShowStandardButtons() 318 319 security.declarePublic('getShowIcons') 320 def getShowIcons(self): 321 return self._getShowIcons() 322 305 323 security.declarePublic('getCreatePortletOnBlogCreation') 306 324 def getCreatePortletOnBlogCreation(self): … … 316 334 lst.append(states[s].id) 317 335 return lst 318 336 319 337 security.declareProtected(CMFCorePermissions.ManagePortal,'getEntryWorkflowStates') 320 338 def getEntryWorkflowStates(self, context): … … 326 344 if not states[s].id in lst: 327 345 lst.append(states[s].id) 328 346 329 347 return lst 330 348 … … 332 350 def getObjectPath(self, object): 333 351 return os.path.join(*object.getPhysicalPath()).replace('\\', '/') 334 352 335 353 # ====================================================== 336 354 # calendar stuff, copied from CMFCalender … … 351 369 """ Returns a list of days with the correct start day first """ 352 370 return calendar.weekheader(2).split() 353 371 354 372 security.declarePublic('getWeeksList') 355 373 def getWeeksList(self, month='1', year='2002'): … … 364 382 # [28, 29, 30, 31, 0, 0, 0]] 365 383 daysByWeek=calendar.monthcalendar(year, month) 366 384 367 385 return daysByWeek 368 386 … … 382 400 daysByWeek=calendar.monthcalendar(year, month) 383 401 weeks=[] 384 402 385 403 events=self.catalog_getevents(context, year, month) 386 404 387 405 for week in daysByWeek: 388 406 days=[] … … 392 410 else: 393 411 days.append({'day': day, 'event': 0, 'eventslist':[]}) 394 412 395 413 weeks.append(days) 396 414 397 415 return weeks 398 416 399 417 security.declarePublic('catalog_getevents') 400 418 def catalog_getevents(self, context, year, month): … … 406 424 ## last_date=DateTime(str(month)+'/'+str(last_day)+'/'+str(year)) 407 425 last_date=first_date + last_day 408 426 409 427 # get the starting point for our search. This is where we depart from the standard catalog_tool: 410 428 startpoint = self.getStartpoint(context, fromHere=0) 411 429 412 430 query=self.portal_catalog(portal_type=self.calendar_types, 413 431 review_state=self._getState(), … … 418 436 path={'query':self.getObjectPath(startpoint),'level':0}, 419 437 sort_on='start') 420 438 421 439 # compile a list of the days that have events 422 440 eventDays={} … … 468 486 # end calendar stuff 469 487 # ================== 470 488 489 490 471 491 InitializeClass(SimpleBlogManager) -
SimpleBlog/branches/plone-2.1-Blogging-APIs/__init__.py
- Property svn:eol-style deleted
r28 r319 3 3 from Products.CMFCore import utils 4 4 from Products.CMFCore.DirectoryView import registerDirectory 5 import os, os.path, sys, content 6 7 from Products.CMFCore.utils import ContentInit 8 from Products.CMFCore.utils import ToolInit 5 import os, os.path 9 6 10 7 from config import SKINS_DIR, GLOBALS, PROJECTNAME 8 from config import ADD_BLOGENTRY_PERMISSION,ADD_SIMPLEBLOG_PERMISSION 11 9 12 10 from Globals import InitializeClass 13 11 12 import xmlrpcMonkeyPatch 13 14 14 registerDirectory(SKINS_DIR, GLOBALS) 15 16 from Products.SimpleBlog.Permissions import wireAddPermissions17 18 # Module aliases - we don't always get it right on the first try, but and we19 # can't move modules around because things are stored in the ZODB with the20 # full module path. However, we can create aliases for backwards compatability.21 22 sys.modules['Products.SimpleBlog.Blog'] = content.blog23 sys.modules['Products.SimpleBlog.BlogEntry'] = content.blogentry24 sys.modules['Products.SimpleBlog.BlogFolder'] = content.blogfolder25 sys.modules['Products.SimpleBlog.TrackBack'] = content.trackback26 15 27 16 def initialize(context): … … 32 21 ModuleSecurityInfo('Products.SimpleBlog.util').declarePublic('encodeURLData') 33 22 34 from content import BlogEntry 35 from content import Blog 36 from content import BlogFolder 37 from content import TrackBack 23 #allow_module('Products.SimpleBlog.Extensions.utils') 38 24 39 25 40 listOfTypes = listTypes(PROJECTNAME) 26 ##Import Types here to register them 27 import BlogEntry 28 import Blog 29 import BlogFolder 30 import TrackBack 31 32 content_types, constructors, ftis = process_types( 33 listTypes(PROJECTNAME), 34 PROJECTNAME) 35 36 37 blogIndex = getTypeIndex(content_types, 'Blog') 38 entryIndex=getTypeIndex(content_types, 'BlogEntry') 39 folderIndex = getTypeIndex(content_types, 'BlogFolder') 40 trackbackIndex = getTypeIndex(content_types, 'TrackBack') 41 41 42 content_types, constructors, ftis = process_types( 43 listOfTypes, 44 PROJECTNAME) 42 blog_contstructor = [] 43 blog_contstructor.append(constructors[blogIndex]) 44 entry_contstructor = [] 45 entry_contstructor.append(constructors[entryIndex]) 46 entry_contstructor.append(constructors[folderIndex]) 47 entry_contstructor.append(constructors[trackbackIndex]) 45 48 46 from Products.SimpleBlog.Permissions import permissions 49 blog_type = [] 50 blog_type.append(content_types[blogIndex]) 51 entry_type = [] 52 entry_type.append(content_types[entryIndex]) 53 entry_type.append(content_types[folderIndex]) 54 entry_type.append(content_types[trackbackIndex]) 47 55 48 allTypes = zip(content_types, constructors) 49 wireAddPermissions() 50 for atype, constructor in allTypes: 51 kind = "%s: %s" % (PROJECTNAME, atype.archetype_name) 52 ContentInit( 53 kind, 54 content_types = (atype,), 55 permission = permissions[atype.portal_type], 56 extra_constructors = (constructor,), 57 fti = ftis, 58 ).initialize(context) 59 56 57 utils.ContentInit( 58 PROJECTNAME + ' Content', 59 content_types = tuple(blog_type), 60 permission = ADD_SIMPLEBLOG_PERMISSION, 61 extra_constructors = tuple(blog_contstructor), 62 fti = ftis, 63 ).initialize(context) 64 65 utils.ContentInit( 66 PROJECTNAME + ' Content', 67 content_types = tuple(entry_type), 68 permission = ADD_BLOGENTRY_PERMISSION, 69 extra_constructors = tuple(entry_contstructor), 70 fti = ftis, 71 ).initialize(context) 72 60 73 61 74 from SimpleBlogTool import SimpleBlogManager … … 66 79 icon='tool.gif', ).initialize(context) 67 80 68 81 def getTypeIndex(content_types, meta_type): 82 for i in range(len(content_types)): 83 if content_types[i].meta_type==meta_type: 84 return i 85 69 86 87 88 89 90 -
SimpleBlog/branches/plone-2.1-Blogging-APIs/version.txt
r211 r319 1 1. 4.0qg1 1.5qg
Note: See TracChangeset
for help on using the changeset viewer.