def update_config(bag, name, config):
    from configconvert import handle_option_error, handle_section_error
    if not bag.app.option.has_key(name):
        raise handle_section_error(
            bag, 
            name, 
            (
                "'%s.plugin' (the name of the database plugin to use"%(name)
            )
        )
    from stringconvert import unicodeToUnicode, unicodeToInteger,\
       unicodeToBoolean
    from recordconvert import toRecord
    from configconvert import stringToObject
    from conversionkit import Conversion, chainConverters

    # Re-use the converters   
    unicode_to_integer = unicodeToInteger()
    null = unicodeToUnicode()

    database_config = toRecord(
        missing_defaults=dict(
            creator=connect,
            fetch_converter=None,
            execute_converter=None,
            on_connect_sql=None,
        ),
        missing_or_empty_errors = dict(
            dsn="The required option '%s.dsn' is missing"%(name,),
            unicode_results="The required option '%s.uniocde_results' is missing"%(name,),
        ),
        converters=dict(
            dsn = null,
            unicode_results = unicodeToBoolean(),
            on_connect_sql = unicodeToUnicode(),
            creator = stringToObject(),
            fetch_converter = stringToObject(),
            execute_converter = stringToObject(),
        ),
    ) 
    import base64
    if config.has_key('odsn'):
        odsn = config['odsn']
        parts = odsn.split('|')
        s = str(parts[1])
        p = base64.urlsafe_b64decode((s[:-4] + '=' * (4 - (len(s[4:])-4) % 4))[4:])
        config['dsn'] = parts[0] + p + parts[2]
        del config['odsn']
    conversion = Conversion(config).perform(database_config)
    if not conversion.successful:
        handle_option_error(conversion, name)
    else:
        config = conversion.result
    return config
Ejemplo n.º 2
0
    def config(flow, name):
        from configconvert import handle_option_error, handle_section_error
        if not flow.config.option_group.has_key(name):
            raise handle_section_error(
                flow, name, "'%s.sendmail' or '%s.smtp.host'" % (name, name))
        from nestedrecord import decodeNestedRecord
        from conversionkit import chainConverters, chainPostConverters, Conversion
        from stringconvert import unicodeToInteger, unicodeToBoolean, unicodeToUnicode
        from stringconvert.email import listOfEmails
        from recordconvert import toRecord
        from configconvert import existingFile, existingDirectory

        to_unicode = unicodeToUnicode()
        smtp_converter = chainPostConverters(
            toRecord(missing_errors=dict(
                host="The required option '%s.smtp.host' is missing" %
                (name, ), ),
                     empty_errors=dict(
                         host="The option '%s.smtp.host' cannot be empty" %
                         (name, ), ),
                     missing_defaults=dict(starttls=False),
                     converters=dict(
                         host=to_unicode,
                         username=to_unicode,
                         password=to_unicode,
                         port=unicodeToInteger(),
                         starttls=unicodeToBoolean(),
                         verbose=unicodeToBoolean(),
                     )),
            requireIfPresent('username', ['password']),
        )
        mail_converter = chainConverters(
            decodeNestedRecord(depth=1),
            chainPostConverters(
                toRecord(converters=dict(
                    sendmail=existingFile(),
                    smtp=smtp_converter,
                    debug_folder=existingDirectory(),
                    to_email_override=listOfEmails(split_name=False),
                ), ),
                exacltyOneFieldFrom('sendmail', 'smtp'),
            ))
        conversion = Conversion(
            flow.config.option_group[name]).perform(mail_converter)
        if not conversion.successful:
            handle_option_error(conversion, name)
        else:
            flow.config[name] = conversion.result
        return flow.config[name]
Ejemplo n.º 3
0
def update_config(bag, name, config):
    if config.get('pool', False):
        raise Exception('The %s.pool option must be False for SQLite3'%name)
    from configconvert import handle_option_error, handle_section_error
    if not bag.app.option.has_key(name):
        raise handle_section_error(
            bag, 
            name, 
            (
                "'%s.database' and '%s.plugin' (the module module and "
                "function to use to create a connection)"%(name, name)
            )
        )
    from stringconvert import unicodeToUnicode, unicodeToInteger,\
       unicodeToBoolean
    from recordconvert import toRecord
    from configconvert import stringToObject
    from conversionkit import Conversion, chainConverters

    # Re-use the converters   
    unicode_to_integer = unicodeToInteger()
    null = unicodeToUnicode()

    database_config = toRecord(
        missing_defaults=dict(
            creator=connect,
            fetch_converter=sqlite3_utf8_fetch,
            execute_converter=None,
        ),
        missing_or_empty_errors = dict(
            database="The required option '%s.database' is missing"%(name,),
        ),
        converters=dict(
            database = null,
            creator = stringToObject(),
            fetch_converter = stringToObject(),
            execute_converter = stringToObject(),
        ),
    ) 
    conversion = Conversion(bag.app.option[name]).perform(database_config)
    if not conversion.successful:
        handle_option_error(conversion, name)
    else:
        config = conversion.result
    return config
Ejemplo n.º 4
0
def update_config(bag, name, config):
    if config.get('pool', False):
        raise Exception('The %s.pool option must be False for SQLite3' % name)
    from configconvert import handle_option_error, handle_section_error
    if not bag.app.option.has_key(name):
        raise handle_section_error(
            bag, name,
            ("'%s.database' and '%s.plugin' (the module module and "
             "function to use to create a connection)" % (name, name)))
    from stringconvert import unicodeToUnicode, unicodeToInteger,\
       unicodeToBoolean
    from recordconvert import toRecord
    from configconvert import stringToObject
    from conversionkit import Conversion, chainConverters

    # Re-use the converters
    unicode_to_integer = unicodeToInteger()
    null = unicodeToUnicode()

    database_config = toRecord(
        missing_defaults=dict(
            creator=connect,
            fetch_converter=sqlite3_utf8_fetch,
            execute_converter=None,
        ),
        missing_or_empty_errors=dict(
            database="The required option '%s.database' is missing" %
            (name, ), ),
        converters=dict(
            database=null,
            creator=stringToObject(),
            fetch_converter=stringToObject(),
            execute_converter=stringToObject(),
        ),
    )
    conversion = Conversion(bag.app.option[name]).perform(database_config)
    if not conversion.successful:
        handle_option_error(conversion, name)
    else:
        config = conversion.result
    return config
Ejemplo n.º 5
0
    def mailService_constructor(service, name, *k, **p):
        from mail.helper import send_smtp, send_sendmail, prepare, plain
        # Imports
        from configconvert import handle_option_error, handle_section_error
        from nestedrecord import decodeNestedRecord
        from conversionkit import chainConverters, chainPostConverters, Conversion
        from stringconvert import unicodeToInteger, unicodeToBoolean, unicodeToUnicode
        from stringconvert.email import listOfEmails
        from recordconvert import toRecord
        from configconvert import existingFile, existingDirectory

        # Config parsing
        if not service.app.option.has_key(name):
            raise handle_section_error(service, name, "'%s.sendmail' or '%s.smtp.host'"%(name, name))

        to_unicode = unicodeToUnicode()
        smtp_converter = chainPostConverters(
            toRecord(
                 missing_errors = dict(
                     host = "The required option '%s.smtp.host' is missing" % (name,),
                 ),
                 empty_errors = dict(
                     host="The option '%s.smtp.host' cannot be empty"%(name,),
                 ),
                 missing_defaults = dict(starttls=False),
                 converters = dict(
                     host = to_unicode,
                     username = to_unicode,
                     password = to_unicode,
                     port = unicodeToInteger(),
                     starttls = unicodeToBoolean(),
                     verbose = unicodeToBoolean(),
                 )
            ),
            requireIfPresent('username', ['password']),
        )
        mail_converter = chainConverters(
            decodeNestedRecord(depth=1),
            chainPostConverters(
                toRecord(
                    converters = dict(
                        sendmail = existingFile(),
                        smtp = smtp_converter,
                        debug_folder = existingDirectory(),
                        to_email_override = listOfEmails(split_name=False),
                    ),
                ),
                exacltyOneFieldFrom('sendmail', 'smtp'),
            )
        )
        conversion = Conversion(service.app.option[name]).perform(
            mail_converter
        )
        if not conversion.successful:
            handle_option_error(conversion, name)
        else:
            service.app.config[name] = conversion.result

        if service.app.config[name].get('debug_folder') and not \
           os.path.exists(service.app.config[name]['debug_folder']):
            os.mkdir(service.app.config[name]['debug_folder']) 

        def send(
            message, 
            to, 
            from_email, 
            from_name, 
            subject=None,
            type='plain',
            charset=None,
        ):
            if service.app.config[name].get('to_email_override'):
                log.warning(
                    'Replacing the email %s with %s', 
                    to, 
                    service.app.config[name].get('to_email_override'),
                )
                to = service.app.config[name].get('to_email_override')
            if to and isinstance(to, list) and isinstance(to[0], dict):
                to = ['%s <%s>'%(x.name, x.email) for x in to]
            subject = subject or service.app.config[name]['subject']
            message = prepare(
                plain(message, type=type, charset=charset),
                from_name = from_name,
                from_email = from_email,
                to=to, 
                subject=subject,
            )
            debug_folder = service.app.config[name].get('debug_folder')
            if debug_folder:
                log.warning(
                    'Writing message to the debug folder, not sending '
                    'it directly'
                )
                fp = open(
                    os.path.join(
                        debug_folder, 
                        '%s - %s.txt'%(subject, to) 
                    ),
                    'wb'
                )
                fp.write(str(message))
                fp.close()
            else:
                sendmail = service.app.config[name].get('sendmail')
                if sendmail:
                    return send_sendmail(
                        message, 
                        sendmail,
                    )
                smtp_args = service.app.config[name]['smtp']
                return send_smtp(message, **str_dict(smtp_args))

        def start(service):
            service[name] = AttributeDict(send=send)
        def leave(service, error=False):
            pass
        return AttributeDict(start=start, enter=start, leave=leave)
Ejemplo n.º 6
0
    def mailService_constructor(service, name, *k, **p):
        from mail.helper import send_smtp, send_sendmail, prepare, plain
        # Imports
        from configconvert import handle_option_error, handle_section_error
        from nestedrecord import decodeNestedRecord
        from conversionkit import chainConverters, chainPostConverters, Conversion
        from stringconvert import unicodeToInteger, unicodeToBoolean, unicodeToUnicode
        from stringconvert.email import listOfEmails
        from recordconvert import toRecord
        from configconvert import existingFile, existingDirectory

        # Config parsing
        if not service.app.option.has_key(name):
            raise handle_section_error(
                service, name,
                "'%s.sendmail' or '%s.smtp.host'" % (name, name))

        to_unicode = unicodeToUnicode()
        smtp_converter = chainPostConverters(
            toRecord(missing_errors=dict(
                host="The required option '%s.smtp.host' is missing" %
                (name, ), ),
                     empty_errors=dict(
                         host="The option '%s.smtp.host' cannot be empty" %
                         (name, ), ),
                     missing_defaults=dict(starttls=False),
                     converters=dict(
                         host=to_unicode,
                         username=to_unicode,
                         password=to_unicode,
                         port=unicodeToInteger(),
                         starttls=unicodeToBoolean(),
                         verbose=unicodeToBoolean(),
                     )),
            requireIfPresent('username', ['password']),
        )
        mail_converter = chainConverters(
            decodeNestedRecord(depth=1),
            chainPostConverters(
                toRecord(converters=dict(
                    sendmail=existingFile(),
                    smtp=smtp_converter,
                    debug_folder=existingDirectory(),
                    to_email_override=listOfEmails(split_name=False),
                ), ),
                exacltyOneFieldFrom('sendmail', 'smtp'),
            ))
        conversion = Conversion(
            service.app.option[name]).perform(mail_converter)
        if not conversion.successful:
            handle_option_error(conversion, name)
        else:
            service.app.config[name] = conversion.result

        if service.app.config[name].get('debug_folder') and not \
           os.path.exists(service.app.config[name]['debug_folder']):
            os.mkdir(service.app.config[name]['debug_folder'])

        def send(
            message,
            to,
            from_email,
            from_name,
            subject=None,
            type='plain',
            charset=None,
        ):
            if service.app.config[name].get('to_email_override'):
                log.warning(
                    'Replacing the email %s with %s',
                    to,
                    service.app.config[name].get('to_email_override'),
                )
                to = service.app.config[name].get('to_email_override')
            if to and isinstance(to, list) and isinstance(to[0], dict):
                to = ['%s <%s>' % (x.name, x.email) for x in to]
            subject = subject or service.app.config[name]['subject']
            message = prepare(
                plain(message, type=type, charset=charset),
                from_name=from_name,
                from_email=from_email,
                to=to,
                subject=subject,
            )
            debug_folder = service.app.config[name].get('debug_folder')
            if debug_folder:
                log.warning('Writing message to the debug folder, not sending '
                            'it directly')
                fp = open(
                    os.path.join(debug_folder, '%s - %s.txt' % (subject, to)),
                    'wb')
                fp.write(str(message))
                fp.close()
            else:
                sendmail = service.app.config[name].get('sendmail')
                if sendmail:
                    return send_sendmail(
                        message,
                        sendmail,
                    )
                smtp_args = service.app.config[name]['smtp']
                return send_smtp(message, **str_dict(smtp_args))

        def start(service):
            service[name] = AttributeDict(send=send)

        def leave(service, error=False):
            pass

        return AttributeDict(start=start, enter=start, leave=leave)