# not sure where this should go yet.
import config
import copy
import os
# NOTE: The Wizard works from a *complete* copy of the standard options
# but with an extra "Wizard" section to maintain state etc for the wizard.
# This initial option set may or may not have had values copied from the
# real runtime config - this allows either a "re-configure" or a
# "clean configure".
# Thus, the Wizard still uses standard config option where suitable - eg
# filter.watch_folder_ids
wizard_defaults = {
"Wizard" : (
("preparation", "How prepared? radio on welcome", 0,
"""""",
config.INTEGER, config.RESTORE),
("need_train", "Will moving to the train page actually train?", True,
"""""",
config.BOOLEAN, config.RESTORE),
("will_train_later", "The user opted to cancel and train later", False,
"""""",
config.BOOLEAN, config.RESTORE),
# Spam
("spam_folder_name", "Name of spam folder - ignored if ID set", "Junk E-Mail",
"""""",
"", config.RESTORE),
# unsure
("unsure_folder_name", "Name of unsure folder - ignored if ID set", "Junk Suspects",
"""""",
"", config.RESTORE),
("temp_training_names", "", [], "", "", config.RESTORE),
),
}
def InitWizardConfig(manager, new_config, from_existing):
manager.wizard_classifier_data = None # this is hacky
new_config.filter.watch_folder_ids = []
new_config.filter.watch_include_sub = False
wc = new_config.wizard
if from_existing:
ids = copy.copy(manager.config.filter.watch_folder_ids)
for id in ids:
# Only get the folders that actually exist.
try:
manager.message_store.GetFolder(id)
# if we get here, it exists!
new_config.filter.watch_folder_ids.append(id)
except manager.message_store.MsgStoreException:
pass
if not new_config.filter.watch_folder_ids:
for folder in manager.message_store.YieldReceiveFolders():
new_config.filter.watch_folder_ids.append(folder.GetID())
if from_existing:
fc = manager.config.filter
if fc.spam_folder_id:
try:
folder = manager.message_store.GetFolder(fc.spam_folder_id)
new_config.filter.spam_folder_id = folder.GetID()
wc.spam_folder_name = ""
except manager.message_store.MsgStoreException:
pass
if fc.unsure_folder_id:
try:
folder = manager.message_store.GetFolder(fc.unsure_folder_id)
new_config.filter.unsure_folder_id = folder.GetID()
wc.unsure_folder_name = ""
except manager.message_store.MsgStoreException:
pass
tc = manager.config.training
if tc.ham_folder_ids:
new_config.training.ham_folder_ids = tc.ham_folder_ids
if tc.spam_folder_ids:
new_config.training.spam_folder_ids = tc.spam_folder_ids
if new_config.training.ham_folder_ids or new_config.training.spam_folder_ids:
wc.preparation = 1 # "already prepared"
def _CreateFolder(manager, name, comment):
try:
root = manager.message_store.GetRootFolder()
new_folder = root.CreateFolder(name, comment, open_if_exists = True)
return new_folder
except:
msg = "There was an error creating the folder named '%s'\r\n" \
"Please restart Outlook and try again" % name
manager.ReportError(msg)
return None
def CommitWizardConfig(manager, wc):
# If the user want to manually configure, then don't do anything
if wc.wizard.preparation == 2: # manually configure
import dialogs
dialogs.ShowDialog(0, manager, manager.config, "IDD_MANAGER")
manager.SaveConfig()
return
# Create the ham and spam folders, if necessary.
manager.config.filter.watch_folder_ids = wc.filter.watch_folder_ids
if wc.filter.spam_folder_id:
manager.config.filter.spam_folder_id = wc.filter.spam_folder_id
else:
assert wc.wizard.spam_folder_name, "No ID, and no name!!!"
f = _CreateFolder(manager, wc.wizard.spam_folder_name, "contains spam filtered by SpamBayes")
manager.config.filter.spam_folder_id = f.GetID()
if wc.filter.unsure_folder_id:
manager.config.filter.unsure_folder_id = wc.filter.unsure_folder_id
else:
assert wc.wizard.unsure_folder_name, "No ID, and no name!!!"
f = _CreateFolder(manager, wc.wizard.unsure_folder_name, "contains messages SpamBayes is uncertain about")
manager.config.filter.unsure_folder_id = f.GetID()
if wc.training.ham_folder_ids:
manager.config.training.ham_folder_ids = wc.training.ham_folder_ids
if wc.training.spam_folder_ids:
manager.config.training.spam_folder_ids = wc.training.spam_folder_ids
wiz_cd = manager.wizard_classifier_data
manager.wizard_classifier_data = None
if wiz_cd:
manager.classifier_data.Adopt(wiz_cd)
if wc.wizard.will_train_later:
# User cancelled, but said they will sort their mail for us.
# don't save the config - this will force the wizard up next time
# outlook is started.
pass
else:
# All done - enable, and save the config
manager.config.filter.enabled = True
manager.SaveConfig()
def CancelWizardConfig(manager, wc):
if manager.wizard_classifier_data:
manager.wizard_classifier_data.Close()
manager.wizard_classifier_data = None
# Cleanup temp files that may have been created.
for fname in wc.wizard.temp_training_names:
if os.path.exists(fname):
try:
os.remove(fname)
except OSError:
print "Warning: unable to remove", fname
def CreateWizardConfig(manager, from_existing):
import config
defaults = wizard_defaults.copy()
defaults.update(config.defaults)
options = config.CreateConfig(defaults)
cfg = config.OptionsContainer(options)
InitWizardConfig(manager, cfg, from_existing)
return cfg
syntax highlighted by Code2HTML, v. 0.9.1