changeset 689:ecc566f8b69f beta

fixes #59, notifications for user registrations + some changes to mailer
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 14 Nov 2010 19:57:14 +0100
parents 8acbfa837180
children 4685f3eafd35
files production.ini rhodecode/config/deployment.ini_tmpl rhodecode/lib/celerylib/tasks.py rhodecode/lib/smtp_mailer.py rhodecode/lib/utils.py rhodecode/model/user.py
diffstat 6 files changed, 62 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/production.ini	Sun Nov 14 17:24:32 2010 +0100
+++ b/production.ini	Sun Nov 14 19:57:14 2010 +0100
@@ -22,6 +22,7 @@
 #smtp_password = 
 #smtp_port = 
 #smtp_use_tls = false
+#smtp_use_ssl = true
 
 [server:main]
 ##nr of threads to spawn
--- a/rhodecode/config/deployment.ini_tmpl	Sun Nov 14 17:24:32 2010 +0100
+++ b/rhodecode/config/deployment.ini_tmpl	Sun Nov 14 19:57:14 2010 +0100
@@ -22,6 +22,7 @@
 #smtp_password = 
 #smtp_port = 
 #smtp_use_tls = false
+#smtp_use_ssl = true
 
 [server:main]
 ##nr of threads to spawn
--- a/rhodecode/lib/celerylib/tasks.py	Sun Nov 14 17:24:32 2010 +0100
+++ b/rhodecode/lib/celerylib/tasks.py	Sun Nov 14 19:57:14 2010 +0100
@@ -230,15 +230,31 @@
 
 @task
 def send_email(recipients, subject, body):
+    """
+    Sends an email with defined parameters from the .ini files.
+    
+    
+    :param recipients: list of recipients, it this is empty the defined email
+        address from field 'email_to' is used instead
+    :param subject: subject of the mail
+    :param body: body of the mail
+    """
     log = send_email.get_logger()
     email_config = dict(config.items('DEFAULT'))
+
+    if not recipients:
+        recipients = [email_config.get('email_to')]
+
+    def str2bool(v):
+        return v.lower() in ["yes", "true", "t", "1"]
+
     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
+    tls = str2bool(email_config.get('smtp_use_tls'))
+    ssl = str2bool(email_config.get('smtp_use_ssl'))
 
     try:
         m = SmtpMailer(mail_from, user, passwd, mail_server,
--- a/rhodecode/lib/smtp_mailer.py	Sun Nov 14 17:24:32 2010 +0100
+++ b/rhodecode/lib/smtp_mailer.py	Sun Nov 14 19:57:14 2010 +0100
@@ -22,7 +22,7 @@
 
     def __init__(self, mail_from, user, passwd, mail_server,
                     mail_port=None, ssl=False, tls=False):
-        
+
         self.mail_from = mail_from
         self.mail_server = mail_server
         self.mail_port = mail_port
@@ -31,7 +31,7 @@
         self.ssl = ssl
         self.tls = tls
         self.debug = False
-        
+
     def send(self, recipients=[], subject='', body='', attachment_files={}):
 
         if isinstance(recipients, basestring):
@@ -43,11 +43,11 @@
 
         if self.tls:
             smtp_serv.starttls()
-         
-        if self.debug:    
+
+        if self.debug:
             smtp_serv.set_debuglevel(1)
 
-        smtp_serv.ehlo("mailer")
+        smtp_serv.ehlo("rhodecode mailer")
 
         #if server requires authorization you must provide login and password
         smtp_serv.login(self.user, self.passwd)
@@ -82,13 +82,13 @@
                 maintype, subtype = ctype.split('/', 1)
                 if maintype == 'text':
                     # Note: we should handle calculating the charset
-                    file_part = MIMEText(self.get_content(msg_file), 
+                    file_part = MIMEText(self.get_content(msg_file),
                                          _subtype=subtype)
                 elif maintype == 'image':
-                    file_part = MIMEImage(self.get_content(msg_file), 
+                    file_part = MIMEImage(self.get_content(msg_file),
                                           _subtype=subtype)
                 elif maintype == 'audio':
-                    file_part = MIMEAudio(self.get_content(msg_file), 
+                    file_part = MIMEAudio(self.get_content(msg_file),
                                           _subtype=subtype)
                 else:
                     file_part = MIMEBase(maintype, subtype)
@@ -96,13 +96,13 @@
                     # Encode the payload using Base64
                     encoders.encode_base64(msg)
                 # Set the filename parameter
-                file_part.add_header('Content-Disposition', 'attachment', 
+                file_part.add_header('Content-Disposition', 'attachment',
                                      filename=f_name)
                 file_part.add_header('Content-Type', ctype, name=f_name)
                 msg.attach(file_part)
         else:
-            raise Exception('Attachment files should be' 
-                            'a dict in format {"filename":"filepath"}')    
+            raise Exception('Attachment files should be'
+                            'a dict in format {"filename":"filepath"}')
 
     def get_content(self, msg_file):
         '''
--- a/rhodecode/lib/utils.py	Sun Nov 14 17:24:32 2010 +0100
+++ b/rhodecode/lib/utils.py	Sun Nov 14 19:57:14 2010 +0100
@@ -68,9 +68,18 @@
         return True
     return False
 
-def action_logger(user, action, repo, ipaddr, sa=None):
+def action_logger(user, action, repo, ipaddr='', sa=None):
     """
     Action logger for various action made by users
+    
+    :param user: user that made this action, can be a string unique username or
+        object containing user_id attribute
+    :param action: action to log, should be on of predefined unique actions for
+        easy translations
+    :param repo: repository that action was made on
+    :param ipaddr: optional ip address from what the action was made
+    :param sa: optional sqlalchemy session
+    
     """
 
     if not sa:
@@ -84,12 +93,22 @@
         else:
             raise Exception('You have to provide user object or username')
 
-        repo_name = repo.lstrip('/')
+
+        if repo:
+            repo_name = repo.lstrip('/')
+
+            repository = RepoModel(sa).get(repo_name, cache=False)
+            if not repository:
+                raise Exception('You have to provide valid repository')
+        else:
+            raise Exception('You have to provide repository to action logger')
+
+
         user_log = UserLog()
         user_log.user_id = user_obj.user_id
         user_log.action = action
         user_log.repository_name = repo_name
-        user_log.repository = RepoModel(sa).get(repo_name, cache=False)
+        user_log.repository = repository
         user_log.action_date = datetime.datetime.now()
         user_log.user_ip = ipaddr
         sa.add(user_log)
--- a/rhodecode/model/user.py	Sun Nov 14 17:24:32 2010 +0100
+++ b/rhodecode/model/user.py	Sun Nov 14 19:57:14 2010 +0100
@@ -72,6 +72,7 @@
             raise
 
     def create_registration(self, form_data):
+        from rhodecode.lib.celerylib import tasks, run_task
         try:
             new_user = User()
             for k, v in form_data.items():
@@ -80,6 +81,14 @@
 
             self.sa.add(new_user)
             self.sa.commit()
+            body = ('New user registration\n'
+                    'username: %s\n'
+                    'email: %s\n')
+            body = body % (form_data['username'], form_data['email'])
+
+            run_task(tasks.send_email, None,
+                     _('[RhodeCode] New User registration'),
+                     body)
         except:
             log.error(traceback.format_exc())
             self.sa.rollback()