def generateImplicitParameters(cls, obj):
        """
        Create PRODID, VERSION, and VTIMEZONEs if needed.

        VTIMEZONEs will need to exist whenever TZID parameters exist or when
        datetimes with tzinfo exist.
        """
        for comp in obj.components():
            if comp.behavior is not None:
                comp.behavior.generateImplicitParameters(comp)
        if not hasattr(obj, 'prodid'):
            obj.add(ContentLine('PRODID', [], PRODID))
        if not hasattr(obj, 'version'):
            obj.add(ContentLine('VERSION', [], cls.versionString))
        tzidsUsed = {}

        def findTzids(obj, table):
            if isinstance(obj, ContentLine) and (obj.behavior is None or
                                                 not obj.behavior.forceUTC):
                if getattr(obj, 'tzid_param', None):
                    table[obj.tzid_param] = 1
                else:
                    if type(obj.value) == list:
                        for item in obj.value:
                            tzinfo = getattr(obj.value, 'tzinfo', None)
                            tzid = TimezoneComponent.registerTzinfo(tzinfo)
                            if tzid:
                                table[tzid] = 1
                    else:
                        tzinfo = getattr(obj.value, 'tzinfo', None)
                        tzid = TimezoneComponent.registerTzinfo(tzinfo)
                        if tzid:
                            table[tzid] = 1
            for child in obj.getChildren():
                if obj.name != 'VTIMEZONE':
                    findTzids(child, table)

        findTzids(obj, tzidsUsed)
        oldtzids = [toUnicode(x.tzid.value) for x in getattr(obj, 'vtimezone_list', [])]
        for tzid in tzidsUsed.keys():
            tzid = toUnicode(tzid)
            if tzid != u'UTC' and tzid not in oldtzids:
                obj.add(TimezoneComponent(tzinfo=getTzid(tzid)))
def generateImplicitParameters ( cls , obj ) : for comp in obj . components ( ) : if comp . behavior is not None : comp . behavior . generateImplicitParameters ( comp ) if not hasattr ( obj , 'prodid' ) : obj . add ( ContentLine ( 'PRODID' , [ ] , PRODID ) ) if not hasattr ( obj , 'version' ) : obj . add ( ContentLine ( 'VERSION' , [ ] , cls . versionString ) ) tzidsUsed = { } def findTzids ( obj , table ) : if isinstance ( obj , ContentLine ) and ( obj . behavior is None or not obj . behavior . forceUTC ) : if getattr ( obj , 'tzid_param' , None ) : table [ obj . tzid_param ] = 1 else : if type ( obj . value ) == list : for item in obj . value : tzinfo = getattr ( obj . value , 'tzinfo' , None ) tzid = TimezoneComponent . registerTzinfo ( tzinfo ) if tzid : table [ tzid ] = 1 else : tzinfo = getattr ( obj . value , 'tzinfo' , None ) tzid = TimezoneComponent . registerTzinfo ( tzinfo ) if tzid : table [ tzid ] = 1 for child in obj . getChildren ( ) : if obj . name != 'VTIMEZONE' : findTzids ( child , table ) findTzids ( obj , tzidsUsed ) oldtzids = [ toUnicode ( x . tzid . value ) for x in getattr ( obj , 'vtimezone_list' , [ ] ) ] for tzid in tzidsUsed . keys ( ) : tzid = toUnicode ( tzid ) if tzid != u'UTC' and tzid not in oldtzids : obj . add ( TimezoneComponent ( tzinfo = getTzid ( tzid ) ) )
Create PRODID, VERSION, and VTIMEZONEs if needed.

        VTIMEZONEs will need to exist whenever TZID parameters exist or when
        datetimes with tzinfo exist.