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