Mercurial > public > src > rhodecode
diff pylons_app/lib/celerylib/tasks.py @ 518:a3d9d24acbec celery
Implemented password reset(forms/models/ tasks) and mailing tasks.
Added smtp mailer, configurations, cleaned user model
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Mon, 13 Sep 2010 01:27:41 +0200 |
parents | 3fc3ce53659b |
children | a9e50dce3081 |
line wrap: on
line diff
--- a/pylons_app/lib/celerylib/tasks.py Mon Sep 13 01:23:58 2010 +0200 +++ b/pylons_app/lib/celerylib/tasks.py Mon Sep 13 01:27:41 2010 +0200 @@ -1,18 +1,82 @@ from celery.decorators import task +from celery.task.sets import subtask from datetime import datetime, timedelta +from os.path import dirname as dn +from pylons.i18n.translation import _ +from pylons_app.lib.celerylib import run_task from pylons_app.lib.helpers import person +from pylons_app.lib.smtp_mailer import SmtpMailer from pylons_app.lib.utils import OrderedDict from time import mktime +from vcs.backends.hg import MercurialRepository +import ConfigParser import calendar -import logging -from vcs.backends.hg import MercurialRepository +import os +import traceback + + +root = dn(dn(dn(dn(os.path.realpath(__file__))))) +config = ConfigParser.ConfigParser({'here':root}) +config.read('%s/development.ini' % root) + +__all__ = ['whoosh_index', 'get_commits_stats', + 'reset_user_password', 'send_email'] + +def get_session(): + from sqlalchemy import engine_from_config + from sqlalchemy.orm import sessionmaker, scoped_session + engine = engine_from_config(dict(config.items('app:main')), 'sqlalchemy.db1.') + sa = scoped_session(sessionmaker(bind=engine)) + return sa -log = logging.getLogger(__name__) +def get_hg_settings(): + from pylons_app.model.db import HgAppSettings + try: + sa = get_session() + ret = sa.query(HgAppSettings).all() + finally: + sa.remove() + + if not ret: + raise Exception('Could not get application settings !') + settings = {} + for each in ret: + settings['hg_app_' + each.app_settings_name] = each.app_settings_value + + return settings -@task() -def whoosh_index(repo_location,full_index): +def get_hg_ui_settings(): + from pylons_app.model.db import HgAppUi + try: + sa = get_session() + ret = sa.query(HgAppUi).all() + finally: + sa.remove() + + if not ret: + raise Exception('Could not get application ui settings !') + settings = {} + for each in ret: + k = each.ui_key + v = each.ui_value + if k == '/': + k = 'root_path' + + if k.find('.') != -1: + k = k.replace('.', '_') + + if each.ui_section == 'hooks': + v = each.ui_active + + settings[each.ui_section + '_' + k] = v + + return settings + +@task +def whoosh_index(repo_location, full_index): + log = whoosh_index.get_logger() from pylons_app.lib.indexers import DaemonLock - from pylons_app.lib.indexers.daemon import WhooshIndexingDaemon,LockHeld + from pylons_app.lib.indexers.daemon import WhooshIndexingDaemon, LockHeld try: l = DaemonLock() WhooshIndexingDaemon(repo_location=repo_location)\ @@ -23,10 +87,12 @@ log.info('LockHeld') return 'LockHeld' -@task() +@task def get_commits_stats(repo): + log = get_commits_stats.get_logger() aggregate = OrderedDict() - repo = MercurialRepository('/home/marcink/hg_repos/'+repo) + repos_path = get_hg_ui_settings()['paths_root_path'].replace('*','') + repo = MercurialRepository(repos_path + repo) #graph range td = datetime.today() + timedelta(days=1) y, m, d = td.year, td.month, td.day @@ -90,3 +156,60 @@ % (author_key_cleaner(repo.contact), author_key_cleaner(repo.contact)) return (ts_min, ts_max, d) + +@task +def reset_user_password(user_email): + log = reset_user_password.get_logger() + from pylons_app.lib import auth + from pylons_app.model.db import User + + try: + + try: + sa = get_session() + user = sa.query(User).filter(User.email == user_email).scalar() + new_passwd = auth.PasswordGenerator().gen_password(8, + auth.PasswordGenerator.ALPHABETS_BIG_SMALL) + user.password = auth.get_crypt_password(new_passwd) + sa.add(user) + sa.commit() + log.info('change password for %s', user_email) + if new_passwd is None: + raise Exception('unable to generate new password') + + except: + log.error(traceback.format_exc()) + sa.rollback() + + run_task(send_email, user_email, + "Your new hg-app password", + 'Your new hg-app password:%s' % (new_passwd)) + log.info('send new password mail to %s', user_email) + + + except: + log.error('Failed to update user password') + log.error(traceback.format_exc()) + return True + +@task +def send_email(recipients, subject, body): + log = send_email.get_logger() + email_config = dict(config.items('DEFAULT')) + mail_from = email_config.get('app_email_from') + user = email_config.get('smtp_username') + passwd = email_config.get('smtp_password') + mail_server = email_config.get('smtp_server') + mail_port = email_config.get('smtp_port') + tls = email_config.get('smtp_use_tls') + ssl = False + + try: + m = SmtpMailer(mail_from, user, passwd, mail_server, + mail_port, ssl, tls) + m.send(recipients, subject, body) + except: + log.error('Mail sending failed') + log.error(traceback.format_exc()) + return False + return True