~sambuddhabasu1/mailman/fix_mailman_run_error

« back to all changes in this revision

Viewing changes to Mailman/Utils.py

  • Committer: Barry Warsaw
  • Date: 2007-07-17 03:55:49 UTC
  • mto: This revision was merged to the branch mainline in revision 6532.
  • Revision ID: barry@python.org-20070717035549-y8epdbg972aju5lj
Major surgery to get the setuptools based installation passing all the
existing unit tests.  Here's a summary of the changes.

- Removed all dependent third party packages, since the setup.py file now
  claims all package dependencies such that they can be automatically
  installed from the cheeseshop.

- Moved the misc directory into the Mailman package as Mailman/data.  Moved
  templates and messages to Mailman subpackages.

- Added an ILanguageManager interface, plus an implementation, so that
  we don't use Defaults.LC_DESCRIPTIONS directly anymore.  Added a doctest
  for this interface and implementation.  Defaults.LANGUAGES is moved into
  mailman.cfg.  Defaults.LANGUAGE_DICT is moved to _DEFAULT_LANGUAGE_DATA, and
  LC_DESCRIPTIONS is removed.  The calculation of the available and enabled
  languages is moved to the Configuration class, but this will probably still
  need work.  Utils.GetLanguageDescr() and Utils.IsLanguage() are removed.
  I'd like to remove GetCharSet() eventually too, but there are too many uses
  of this currently, so I'm deferring it.

- Utils.findtext(): Hacks added so that templates can be retrieved from the
  language catalog.  The hack is that the template contents are used to find
  the translation, but in the one test case where this is actually flexed, the
  trailing newline in the file contents has to be trimmed.  This is probably
  not right.

- No more Defaults.py.in or mm_cfg.py!  Defaults.py.in is moved to Defaults.py
  and is no longer created from a template file.  The script called
  make_instance is added which creates an etc/mailman.cfg file from
  mailman.cfg.in (previously, mailman.cfg.sample) and /that/ file now has the
  small number of calculated values.  In general, make_instance will not touch
  mailman.cfg if it exists, unless the --force option is given.  CGIEXT is
  made the empty string by default (i.e. not generated).  make_instance grows
  a --var-dir option.  Fleshed out the --languages opton.

- Defaults.py grows a DEFAULT_VAR_DIRECTORY variable, which is the default
  location of the 'var' directory.  The Configuration class uses this as one
  of the directories it searches for its landmark, i.e. etc/mailman.cfg.
  RUNTIME_DIR is gone, as is VAR_PREFIX.

- testall needs to write MAILMAN_USER, MAILMAN_UID, MAILMAN_GROUP,
  MAILMAN_GID, and LANGUAGES run time variables.

- bin/withlist no longer needs to add config.BIN_DIR to sys.path, because in
  fact that variable doesn't exist any more.

- Tweak the French catalog to make a test work.  This is needed because of the
  conversion from %-strings to $-strings.

- The setup.py now generates the .mo files before it does its thing.  This
  will have to be fixed, but for now we must generate these files on setup
  build time instead of installation time.

- Removed an unused interface.

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
from email.Errors import HeaderParseError
40
40
from string import ascii_letters, digits, whitespace
41
41
 
 
42
import Mailman.templates
42
43
from Mailman import Errors
43
44
from Mailman import passwords
44
45
from Mailman.SafeDict import SafeDict
51
52
IDENTCHARS = ascii_letters + digits + '_'
52
53
NL = '\n'
53
54
UEMPTYSTRING = u''
 
55
TEMPLATE_DIR = os.path.dirname(Mailman.templates.__file__)
54
56
 
55
57
# Search for $(identifier)s strings, except that the trailing s is optional,
56
58
# since that's a common mistake
450
452
    # language.  After that, the server default language is used for
451
453
    # <language>.  If that still doesn't yield a template, then the standard
452
454
    # distribution's English language template is used as an ultimate
453
 
    # fallback.  If that's missing you've got big problems. ;)
 
455
    # fallback, and when lang is not 'en', the resulting template is passed
 
456
    # through the translation service.  If this template is missing you've got
 
457
    # big problems. ;)
454
458
    #
455
459
    # A word on backwards compatibility: Mailman versions prior to 2.1 stored
456
460
    # templates in templates/*.{html,txt} and lists/<listname>/*.{html,txt}.
466
470
    # item returned.
467
471
    #
468
472
    # Calculate the languages to scan
469
 
    languages = []
 
473
    languages = set()
470
474
    if lang is not None:
471
 
        languages.append(lang)
 
475
        languages.add(lang)
472
476
    if mlist is not None:
473
 
        languages.append(mlist.preferred_language)
474
 
    languages.append(config.DEFAULT_SERVER_LANGUAGE)
 
477
        languages.add(mlist.preferred_language)
 
478
    languages.add(config.DEFAULT_SERVER_LANGUAGE)
475
479
    # Calculate the locations to scan
476
480
    searchdirs = []
477
481
    if mlist is not None:
478
482
        searchdirs.append(mlist.full_path)
479
 
        searchdirs.append(os.path.join(config.TEMPLATE_DIR, mlist.host_name))
480
 
    searchdirs.append(os.path.join(config.TEMPLATE_DIR, 'site'))
481
 
    searchdirs.append(config.TEMPLATE_DIR)
 
483
        searchdirs.append(os.path.join(TEMPLATE_DIR, mlist.host_name))
 
484
    searchdirs.append(os.path.join(TEMPLATE_DIR, 'site'))
 
485
    searchdirs.append(TEMPLATE_DIR)
482
486
    # Start scanning
483
487
    fp = None
484
488
    try:
498
502
        # Try one last time with the distro English template, which, unless
499
503
        # you've got a really broken installation, must be there.
500
504
        try:
501
 
            filename = os.path.join(config.TEMPLATE_DIR, 'en', templatefile)
 
505
            filename = os.path.join(TEMPLATE_DIR, 'en', templatefile)
502
506
            fp = open(filename)
503
507
        except IOError, e:
504
 
            if e.errno <> errno.ENOENT: raise
 
508
            if e.errno <> errno.ENOENT:
 
509
                raise
505
510
            # We never found the template.  BAD!
506
511
            raise IOError(errno.ENOENT, 'No template file found', templatefile)
507
 
    template = fp.read()
508
 
    fp.close()
509
 
    template = unicode(template, GetCharSet(lang), 'replace')
 
512
        else:
 
513
            from Mailman.i18n import get_translation
 
514
            # XXX BROKEN HACK
 
515
            data = fp.read()[:-1]
 
516
            template = get_translation().ugettext(data)
 
517
            fp.close()
 
518
    else:
 
519
        template = fp.read()
 
520
        fp.close()
 
521
        template = unicode(template, GetCharSet(lang), 'replace')
510
522
    text = template
511
523
    if dict is not None:
512
524
        try:
513
525
            sdict = SafeDict(dict, lang=lang)
514
526
            text = sdict.interpolate(template)
515
 
        except (TypeError, ValueError), e:
 
527
        except (TypeError, ValueError):
516
528
            # The template is really screwed up
517
 
            log.error('broken template: %s\n%s', filename, e)
518
 
            pass
 
529
            log.exception('broken template: %s', filename)
519
530
    if raw:
520
531
        return text, filename
521
532
    return wrap(text), filename
646
657
 
647
658
 
648
659
 
649
 
def GetLanguageDescr(lang):
650
 
    return config.LC_DESCRIPTIONS[lang][0]
651
 
 
652
 
 
 
660
# XXX Replace this with direct calls.  For now, existing uses of GetCharSet()
 
661
# are too numerous to change.
653
662
def GetCharSet(lang):
654
 
    return config.LC_DESCRIPTIONS[lang][1]
655
 
 
656
 
def IsLanguage(lang):
657
 
    return config.LC_DESCRIPTIONS.has_key(lang)
 
663
    return config.languages.get_language_data(lang)[1]
658
664
 
659
665
 
660
666