Changeset 3133 for trunk


Ignore:
Timestamp:
01/08/11 01:44:15 (9 years ago)
Author:
jukka
Message:

Tuned archetype update scripts.

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Collection.py

    r3120 r3133  
    5959    ), 
    6060     
    61     ReferenceField('refsToResources', 
    62         accessor = 'getRefsToResources', 
    63         relationship = 'References', 
    64         mutator = 'addRefsToResources', 
    65         allowed_types = ALL_CONTENT_TYPES, 
    66         multiValued = True, 
    67         widget = ReferenceBrowserWidget( 
    68             visible = {'view':'invisible', 'edit':'invisible'}, 
    69             ), 
    70     ), 
    7161    ReferenceField('relatedContent', 
    7262        relationship = 'relatesToContent', 
     
    209199    def at_post_edit_script(self): 
    210200        self._renameAfterCreation() 
    211         self.updateStory() 
     201        self. updateStory() 
    212202 
    213203    def after_add_rename(self): 
  • trunk/CommonMixIn.py

    r3126 r3133  
    2323from Products.CMFCore.utils import getToolByName 
    2424from AccessControl import ClassSecurityInfo, Unauthorized 
     25from Products.Archetypes.ArchetypeTool import _guessPackage, getType 
    2526from config import PROJECTNAME, MATERIAL_TYPES, DEFAULT_ICONS, TYPE_ABBREVIATIONS, TOOLS_TYPES, ACTIVITY_TYPES 
    2627from Products.LeMill import LeMillMessageFactory as _ 
     
    3031from Acquisition import aq_inner, aq_parent 
    3132from types import MethodType as instancemethod 
    32 import time, re, traceback, transaction 
     33import time, re, traceback, transaction, sys 
    3334 
    3435# For sortable_title -method 
     
    269270 
    270271    security.declareProtected(MODIFY_CONTENT, 'setId') 
    271     def setId(self, value): 
     272    def setId(self, value, **kwargs): 
    272273        """Sets the object id. 
    273274        """ 
    274275        value=str(value) 
    275276        old_id=self.getId() 
    276         if (value != old_id) or isinstance(old_id, unicode): 
     277        if (value != old_id): 
    277278            parent = aq_parent(aq_inner(self)) 
    278279            if parent is not None: 
     
    281282                parent.manage_renameObject(self.id, value) 
    282283            self._setId(value) 
    283         elif type(self.getId())!=str: 
     284        elif isinstance(old_id, unicode): 
    284285            #print 'Renaming %s' % value 
    285286            parent = aq_parent(aq_inner(self)) 
     
    294295                    self._setId(value) 
    295296                except KeyError: 
    296                     print '!!!!! Obj %s is so broken it has to be deleted' % self.id  
    297                     parent._delOb(old_id) 
     297                    print '!!!!! Obj %s is so broken it has to be deleted' % self.id 
     298                    try: 
     299                        parent._delOb(old_id) 
     300                    except: 
     301                        pass 
    298302                except AttributeError: 
    299303                    pass                 
     
    363367        """ Wrapper to make schema updates easier. Also checks if there are bad values and fixes them. Also reindexes. """ 
    364368        o=self 
    365         print 'checking if schema for %s is up to date...' % o.id 
     369        #print 'checking if schema for %s is up to date...' % o.id 
    366370        retry=False 
    367371        # Fix too long id:s 
    368372        if len(str(o.getId()))>220: 
    369             print 'id is too long. fixing it before proceeding further.'  
     373            #print 'id is too long. fixing it before proceeding further.'  
    370374            id_base=str(o.getId())[:220] 
    371375            id_candidate=id_base 
     
    381385                retry=True 
    382386        if not o._isSchemaCurrent(): 
    383             print 'schema needs updating' 
     387            #print 'schema needs updating' 
    384388            o._updateSchema() 
    385             # Fix instancemethods from field values 
    386 #            for f in o.schema.fields(): 
    387 #                value=f.get(o) 
    388 #                if type(value)==instancemethod: 
    389 #                    print 'InstanceMethod found in field %s in object %s (type should be: %s)' % (f.getName(), o.getId(), f.type) 
    390 #                    if f.type=='string': 
    391 #                        f.set(o, '') 
    392 #                    elif f.type=='boolean': 
    393 #                        f.set(o, False) 
    394 #                    elif f.type=='int': 
    395 #                        f.set(o, 0) 
    396 #                    elif f.type=='tuple': 
    397 #                        f.set(o, ()) 
    398 #                    elif f.type=='list': 
    399 #                        f.set(o, []) 
    400 #                    else: 
    401 #                        f.set(o, None)                                  
    402389            o.reindexObject() 
    403             print 'updated & reindexed.' 
     390            #print 'updated & reindexed.' 
    404391        if retry: 
    405392            try: 
     
    407394            except: 
    408395                pass        
     396 
     397    security.declarePrivate('_updateSchema') 
     398    def _updateSchema(self, excluded_fields=[], out=None): 
     399        """ 
     400        LeMill changes: 
     401        If the old value is ImplicitAcquirerWrapper in wrong place,  
     402        replace it with the real thing. 
     403        Adds flag 'schema_update' to set-method call to avoid circular and overlapping activity  
     404         
     405        BaseObject: 
     406        Updates an object's schema when the class schema changes. 
     407 
     408        For each field we use the existing accessor to get its value, 
     409        then we re-initialize the class, then use the new schema 
     410        mutator for each field to set the values again. 
     411 
     412        We also copy over any class methods to handle product 
     413        refreshes gracefully (when a product refreshes, you end up 
     414        with both the old version of the class and the new in memory 
     415        at the same time -- you really should restart zope after doing 
     416        a schema update). 
     417        """ 
     418        if out: 
     419            print >> out, 'Updating %s' % (self.getId()) 
     420 
     421        package = _guessPackage(self.__module__) 
     422        new_schema = getType(self.meta_type, package)['schema'] 
     423 
     424        # Read all the old values into a dict 
     425        values = {} 
     426        mimes = {} 
     427        for f in new_schema.fields(): 
     428            name = f.getName() 
     429            if name in excluded_fields: continue 
     430            if f.type == "reference": continue 
     431            try: 
     432                val = self._migrateGetValue(name, new_schema) 
     433                if callable(val): 
     434                    if hasattr(val, 'aq_base'): 
     435                        val=val.aq_base 
     436                        #print 'converting field %s' % name 
     437                values[name]=val 
     438            except ValueError: 
     439                if out != None: 
     440                    print >> out, ('Unable to get %s.%s' 
     441                                   % (str(self.getId()), name)) 
     442            else: 
     443                if shasattr(f, 'getContentType'): 
     444                    mimes[name] = f.getContentType(self) 
     445 
     446        obj_class = self.__class__ 
     447        current_class = getattr(sys.modules[self.__module__], 
     448                                self.__class__.__name__) 
     449        if obj_class.schema != current_class.schema: 
     450            # XXX This is kind of brutish.  We do this to make sure that old 
     451            # class instances have the proper methods after a refresh.  The 
     452            # best thing to do is to restart Zope after doing an update, and 
     453            # the old versions of the class will disappear. 
     454 
     455            for k in current_class.__dict__.keys(): 
     456                obj_class.__dict__[k] = current_class.__dict__[k] 
     457 
     458        # Replace the schema 
     459        self.schema = new_schema.copy() 
     460        # Set a request variable to avoid resetting the newly created flag 
     461        req = getattr(self, 'REQUEST', None) 
     462        if req is not None: 
     463            req.set('SCHEMA_UPDATE','1') 
     464        self.initializeArchetype() 
     465 
     466        for f in new_schema.fields(): 
     467            name = f.getName() 
     468            kw = {} 
     469            if name not in excluded_fields and values.has_key(name): 
     470                kw['schema_update']=True 
     471                if mimes.has_key(name): 
     472                    kw['mimetype'] = mimes[name] 
     473                try: 
     474                    self._migrateSetValue(name, values[name], **kw) 
     475                except ValueError: 
     476                    if out != None: 
     477                        print >> out, ('Unable to set %s.%s to ' 
     478                                       '%s' % (str(self.getId()), 
     479                                               name, str(values[name]))) 
     480                except TypeError: 
     481                    #print "setting value failed. Unable to set %s.%s to '%s'" % (str(self.getId()),name, str(values[name])) 
     482                    pass 
     483        # Make sure the changes are persisted 
     484        self._p_changed = 1 
     485        if out: 
     486            return out 
    409487 
    410488    ####### Cataloging ################################### 
     
    716794        cover=self.getField('coverImage') 
    717795        cover.set(self,value,**kwargs) 
    718         has_cover=self.getField('hasCoverImage') 
    719         if value==None: 
    720             has_cover.set(self,False) 
    721         else: 
    722             has_cover.set(self,True) 
    723         self.reindexCollections() 
     796        if 'schema_update' not in kwargs and '_initializing_' not in kwargs: 
     797            has_cover=self.getField('hasCoverImage') 
     798            if value==None: 
     799                has_cover.set(self,False) 
     800            else: 
     801                has_cover.set(self,True) 
     802            self.reindexCollections() 
    724803 
    725804    security.declareProtected(MODIFY_CONTENT,'delCoverImage') 
  • trunk/FieldsWidgets.py

    r3130 r3133  
    722722            LinesField.set(self, instance, value) 
    723723 
     724    security.declarePrivate('get') 
     725    def get(self, instance, **kwargs): 
     726        val=LinesField.get(self, instance, **kwargs) 
     727        if callable(val): 
     728            val=val() 
     729        return val 
     730 
     731    security.declarePrivate('getRaw') 
     732    def getRaw(self, instance, **kwargs): 
     733        val=LinesField.getRaw(self, instance, **kwargs) 
     734        if val and callable(val): 
     735            val=val() 
     736        return val 
     737 
    724738                         
    725739registerField(TranslationField, 
     
    765779        else: 
    766780            value = LinesField.get(self, instance, **kwargs) 
     781            if value and callable(value): 
     782                value=value() 
    767783        return ', '.join(value) 
    768784 
     
    781797        else: 
    782798            value = LinesField.get(self, instance, **kwargs) 
     799            if value and callable(value): 
     800                value=value() 
    783801        return value 
    784802 
     
    880898        if not isinstance(value, list): 
    881899            value = [] 
     900        if value and callable(value): 
     901            value=value() 
    882902        for chapter in value: 
    883903            if isinstance(chapter, tuple): 
     
    13461366        else: 
    13471367            value = ObjectField.get(self, instance, **kwargs) 
     1368        if value and callable(value): 
     1369            value=value() 
    13481370        return value 
    13491371 
     
    13831405        if not field_data: 
    13841406            return "" 
     1407        if callable(field_data): 
     1408            field_data=field_data() 
    13851409        links = re.findall('\{.*?\}', field_data) 
    13861410        for link in links: 
  • trunk/MaintenanceTool.py

    r3123 r3133  
    55from Products.CMFCore.utils import getToolByName 
    66from Products.ZCatalog.CatalogBrains import AbstractCatalogBrain 
     7from Products.Archetypes.ArchetypeTool import _guessPackage, getType 
    78from permissions import ModerateContent, MODIFY_CONTENT, DELETE_CONTENT, MANAGE_PORTAL, ACCESS_CONTENT, VIEW, ADD_CONTENT_PERMISSION 
    89from CommonMixIn import Redirector 
     
    1213import time,re 
    1314import os, ConfigParser 
     15 
    1416from shutil import copy2 
    1517 
     
    2628 
    2729    ######### HOSTING SCRIPTS ################ 
     30 
     31    security.declareProtected(MANAGE_PORTAL, 'findCallableFieldValues') 
     32    def findCallableFieldValues(self, start=0, end=90000, type_id=0): 
     33        """ We seem to have instancemethods as field values. How often this happens? """ 
     34        portal_types=list(SEARCHABLE_TYPES) 
     35        if type_id.isdigit(): 
     36            portal_type=portal_types[min((int(type_id), len(portal_types)-1))] 
     37        else: 
     38            portal_type=type_id 
     39        s=['Finding callable field values for %s' % portal_type ] 
     40        pc=getToolByName(self, 'portal_catalog') 
     41        full_md=pc(portal_type=portal_type) 
     42        s.append('Found %s objects' % len(full_md)) 
     43        start=min((int(start), len(full_md)-1)) 
     44        end=min((int(end), len(full_md)-1))        
     45        response=[] 
     46        total=start 
     47        failed=updated=0 
     48        t=time.time() 
     49        o=self.safeGetObject(full_md[start]) # we get one sample object to decide package and schema for all 
     50        package = _guessPackage(o.__module__) 
     51        new_schema = getType(o.meta_type, package)['schema'] 
     52        for oid in full_md[start:end]:            
     53            o=self.safeGetObject(oid) 
     54            if not o: 
     55                failed+=1 
     56                continue       
     57            # Read all the old values into a dict 
     58            #s.append('Checking %s' % o.id) 
     59            for f in new_schema.fields(): 
     60                name = f.getName() 
     61                if f.type == "reference": continue 
     62                try: 
     63                    value = o._migrateGetValue(name, new_schema) 
     64                    if f.type=='image' or f.type=='file': 
     65                        continue 
     66                    elif callable(value): 
     67                        s.append('Field %s is callable! (%s %s)' % (name, type(value), f.type))  
     68                        value=value() 
     69                        s.append('Value should be %s' % value)                        
     70                        f.set(o, value) 
     71                        s.append('Rewrote it.') 
     72                except ValueError: 
     73                    s.append('Unable to get %s.%s' 
     74                                       % (str(o.getId()), name)) 
     75            updated+=1 
     76            total+=1 
     77        s.append('Done. %s resources checked' % updated) 
     78        s.append(str(time.time()-t)) 
     79        return '\n'.join(s)   
     80 
     81 
     82     
    2883 
    2984    security.declareProtected(MANAGE_PORTAL, 'countBranchables') 
  • trunk/Schemata.py

    r3130 r3133  
    189189           ), 
    190190       ), 
    191    LinesField('relatedItems', 
    192        searchable=False, 
    193        index=None, 
    194        widget=KeywordWidget( 
    195            visible={'view':'invisible','edit':'invisible'} 
    196            ), 
    197        ), 
     191    ReferenceField('relatedItems', 
     192        relationship = 'relatesTo', 
     193        index = None, 
     194        widget = LinesWidget( 
     195            visible = {'edit' : 'invisible', 'view' : 'invisible' } 
     196            ), 
     197        ), 
     198 
    198199     
    199200)) 
  • trunk/version.txt

    r3130 r3133  
    1 3.0.10 
     13.0.11 
    22 
Note: See TracChangeset for help on using the changeset viewer.