comparison pylons_app/lib/celerylib/tasks.py @ 474: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
comparison
equal deleted inserted replaced
473:6b934c9607e7 474:a3d9d24acbec
1 from celery.decorators import task 1 from celery.decorators import task
2 from celery.task.sets import subtask
2 from datetime import datetime, timedelta 3 from datetime import datetime, timedelta
4 from os.path import dirname as dn
5 from pylons.i18n.translation import _
6 from pylons_app.lib.celerylib import run_task
3 from pylons_app.lib.helpers import person 7 from pylons_app.lib.helpers import person
8 from pylons_app.lib.smtp_mailer import SmtpMailer
4 from pylons_app.lib.utils import OrderedDict 9 from pylons_app.lib.utils import OrderedDict
5 from time import mktime 10 from time import mktime
11 from vcs.backends.hg import MercurialRepository
12 import ConfigParser
6 import calendar 13 import calendar
7 import logging 14 import os
8 from vcs.backends.hg import MercurialRepository 15 import traceback
9 16
10 log = logging.getLogger(__name__) 17
11 18 root = dn(dn(dn(dn(os.path.realpath(__file__)))))
12 @task() 19 config = ConfigParser.ConfigParser({'here':root})
13 def whoosh_index(repo_location,full_index): 20 config.read('%s/development.ini' % root)
21
22 __all__ = ['whoosh_index', 'get_commits_stats',
23 'reset_user_password', 'send_email']
24
25 def get_session():
26 from sqlalchemy import engine_from_config
27 from sqlalchemy.orm import sessionmaker, scoped_session
28 engine = engine_from_config(dict(config.items('app:main')), 'sqlalchemy.db1.')
29 sa = scoped_session(sessionmaker(bind=engine))
30 return sa
31
32 def get_hg_settings():
33 from pylons_app.model.db import HgAppSettings
34 try:
35 sa = get_session()
36 ret = sa.query(HgAppSettings).all()
37 finally:
38 sa.remove()
39
40 if not ret:
41 raise Exception('Could not get application settings !')
42 settings = {}
43 for each in ret:
44 settings['hg_app_' + each.app_settings_name] = each.app_settings_value
45
46 return settings
47
48 def get_hg_ui_settings():
49 from pylons_app.model.db import HgAppUi
50 try:
51 sa = get_session()
52 ret = sa.query(HgAppUi).all()
53 finally:
54 sa.remove()
55
56 if not ret:
57 raise Exception('Could not get application ui settings !')
58 settings = {}
59 for each in ret:
60 k = each.ui_key
61 v = each.ui_value
62 if k == '/':
63 k = 'root_path'
64
65 if k.find('.') != -1:
66 k = k.replace('.', '_')
67
68 if each.ui_section == 'hooks':
69 v = each.ui_active
70
71 settings[each.ui_section + '_' + k] = v
72
73 return settings
74
75 @task
76 def whoosh_index(repo_location, full_index):
77 log = whoosh_index.get_logger()
14 from pylons_app.lib.indexers import DaemonLock 78 from pylons_app.lib.indexers import DaemonLock
15 from pylons_app.lib.indexers.daemon import WhooshIndexingDaemon,LockHeld 79 from pylons_app.lib.indexers.daemon import WhooshIndexingDaemon, LockHeld
16 try: 80 try:
17 l = DaemonLock() 81 l = DaemonLock()
18 WhooshIndexingDaemon(repo_location=repo_location)\ 82 WhooshIndexingDaemon(repo_location=repo_location)\
19 .run(full_index=full_index) 83 .run(full_index=full_index)
20 l.release() 84 l.release()
21 return 'Done' 85 return 'Done'
22 except LockHeld: 86 except LockHeld:
23 log.info('LockHeld') 87 log.info('LockHeld')
24 return 'LockHeld' 88 return 'LockHeld'
25 89
26 @task() 90 @task
27 def get_commits_stats(repo): 91 def get_commits_stats(repo):
92 log = get_commits_stats.get_logger()
28 aggregate = OrderedDict() 93 aggregate = OrderedDict()
29 repo = MercurialRepository('/home/marcink/hg_repos/'+repo) 94 repos_path = get_hg_ui_settings()['paths_root_path'].replace('*','')
95 repo = MercurialRepository(repos_path + repo)
30 #graph range 96 #graph range
31 td = datetime.today() + timedelta(days=1) 97 td = datetime.today() + timedelta(days=1)
32 y, m, d = td.year, td.month, td.day 98 y, m, d = td.year, td.month, td.day
33 ts_min = mktime((y, (td - timedelta(days=calendar.mdays[m])).month, 99 ts_min = mktime((y, (td - timedelta(days=calendar.mdays[m])).month,
34 d, 0, 0, 0, 0, 0, 0,)) 100 d, 0, 0, 0, 0, 0, 0,))
88 if d == '': 154 if d == '':
89 d = '"%s":{label:"%s",data:[[0,1],]}' \ 155 d = '"%s":{label:"%s",data:[[0,1],]}' \
90 % (author_key_cleaner(repo.contact), 156 % (author_key_cleaner(repo.contact),
91 author_key_cleaner(repo.contact)) 157 author_key_cleaner(repo.contact))
92 return (ts_min, ts_max, d) 158 return (ts_min, ts_max, d)
159
160 @task
161 def reset_user_password(user_email):
162 log = reset_user_password.get_logger()
163 from pylons_app.lib import auth
164 from pylons_app.model.db import User
165
166 try:
167
168 try:
169 sa = get_session()
170 user = sa.query(User).filter(User.email == user_email).scalar()
171 new_passwd = auth.PasswordGenerator().gen_password(8,
172 auth.PasswordGenerator.ALPHABETS_BIG_SMALL)
173 user.password = auth.get_crypt_password(new_passwd)
174 sa.add(user)
175 sa.commit()
176 log.info('change password for %s', user_email)
177 if new_passwd is None:
178 raise Exception('unable to generate new password')
179
180 except:
181 log.error(traceback.format_exc())
182 sa.rollback()
183
184 run_task(send_email, user_email,
185 "Your new hg-app password",
186 'Your new hg-app password:%s' % (new_passwd))
187 log.info('send new password mail to %s', user_email)
188
189
190 except:
191 log.error('Failed to update user password')
192 log.error(traceback.format_exc())
193 return True
194
195 @task
196 def send_email(recipients, subject, body):
197 log = send_email.get_logger()
198 email_config = dict(config.items('DEFAULT'))
199 mail_from = email_config.get('app_email_from')
200 user = email_config.get('smtp_username')
201 passwd = email_config.get('smtp_password')
202 mail_server = email_config.get('smtp_server')
203 mail_port = email_config.get('smtp_port')
204 tls = email_config.get('smtp_use_tls')
205 ssl = False
206
207 try:
208 m = SmtpMailer(mail_from, user, passwd, mail_server,
209 mail_port, ssl, tls)
210 m.send(recipients, subject, body)
211 except:
212 log.error('Mail sending failed')
213 log.error(traceback.format_exc())
214 return False
215 return True