Project Notifications
authorSofia Papagiannaki <papagian@gmail.com>
Tue, 11 Dec 2012 16:15:30 +0000 (18:15 +0200)
committerSofia Papagiannaki <papagian@gmail.com>
Tue, 11 Dec 2012 16:15:30 +0000 (18:15 +0200)
12 files changed:
snf-astakos-app/README
snf-astakos-app/astakos/im/management/commands/project-update.py
snf-astakos-app/astakos/im/models.py
snf-astakos-app/astakos/im/notifications.py
snf-astakos-app/astakos/im/settings.py
snf-astakos-app/astakos/im/synnefo_settings.py
snf-astakos-app/astakos/im/templates/im/projects/project_approval_notification.txt [new file with mode: 0644]
snf-astakos-app/astakos/im/templates/im/projects/project_creation_notification.txt [new file with mode: 0644]
snf-astakos-app/astakos/im/templates/im/projects/project_membership_change_notification.txt [new file with mode: 0644]
snf-astakos-app/astakos/im/templates/im/projects/project_suspension_notification.txt [new file with mode: 0644]
snf-astakos-app/astakos/im/templates/im/projects/project_termination_notification.txt [new file with mode: 0644]
snf-astakos-app/conf/20-snf-astakos-app-settings.conf

index d806083..30f9adf 100644 (file)
@@ -90,6 +90,11 @@ ASTAKOS_GROUP_CREATION_SUBJECT              '%s alpha2 testing group created (%%
 ASTAKOS_HELPDESK_NOTIFICATION_EMAIL_SUBJECT '%s alpha2 testing account activated (%%(user)s)' % SITENAME                    Account activation helpdesk notification email subject
 ASTAKOS_EMAIL_CHANGE_EMAIL_SUBJECT          'Email change on %s alpha2 testing' % SITENAME                                  Email change subject               
 ASTAKOS_PASSWORD_RESET_EMAIL_SUBJECT        'Password reset on %s alpha2 testing' % SITENAME                                Password change email subject
+ASTAKOS_PROJECT_CREATION_SUBJECT            '%s alpha2 testing project application created (%%(name)s)' % SITENAME          Project application creation subject
+ASTAKOS_PROJECT_APPROVED_SUBJECT            '%s alpha2 testing project application approved (%%(name)s)' % SITENAME         Project application approval subject
+ASTAKOS_PROJECT_TERMINATION_SUBJECT         '%s alpha2 testing project terminated (%%(name)s)' % SITENAME                   Project termination subject
+ASTAKOS_PROJECT_SUSPENSION_SUBJECT          '%s alpha2 testing project suspended (%%(name)s)' % SITENAME                    Project suspension subject
+ASTAKOS_PROJECT_MEMBERSHIP_CHANGE_SUBJECT   '%s alpha2 testing project membership changed (%%(name)s)' % SITENAME           Project membership change subject
 
 ASTAKOS_QUOTAHOLDER_URL                     ''                                                                              The quotaholder URI
                                                                                                                             e.g. ``http://localhost:8080/api/quotaholder/v``
index f0a2fa7..2315106 100644 (file)
@@ -75,9 +75,10 @@ class Command(BaseCommand):
             except Http404:
                 raise CommandError('Invalid id')
             else:
-                if options['terminate']:
-                    p.terminate()
-                elif options['suspend']:
-                    p.suspend()
-            except BaseException, e:
-                raise CommandError(e)
+                try:
+                    if options['terminate']:
+                        p.terminate()
+                    elif options['suspend']:
+                        p.suspend()
+                except BaseException, e:
+                    raise CommandError(e)
index f65e1ba..e77c3e3 100644 (file)
@@ -69,7 +69,10 @@ from astakos.im.settings import (
     DEFAULT_USER_LEVEL, INVITATIONS_PER_LEVEL,
     AUTH_TOKEN_DURATION, BILLING_FIELDS,
     EMAILCHANGE_ACTIVATION_DAYS, LOGGING_LEVEL,
-    GROUP_CREATION_SUBJECT, SITENAME, SERVICES
+    SITENAME, SERVICES,
+    PROJECT_CREATION_SUBJECT, PROJECT_APPROVED_SUBJECT,
+    PROJECT_TERMINATION_SUBJECT, PROJECT_SUSPENSION_SUBJECT,
+    PROJECT_MEMBERSHIP_CHANGE_SUBJECT
 )
 from astakos.im.endpoints.qh import (
     register_users, send_quota, register_resources
@@ -1227,14 +1230,24 @@ class ProjectApplication(models.Model):
 
         if commit:
             application.save()
-        else:
-            notification = build_notification(
-                settings.SERVER_EMAIL,
-                [i[1] for i in settings.ADMINS],
-                _(GROUP_CREATION_SUBJECT) % {'group':application.definition.name},
-                _('A new project application identified by %(id)s has been submitted.') % application.__dict__
-            )
-            notification.send()
+            application.definition.resource_policies = resource_policies
+            # better implementation ???
+            if precursor_application:
+                try:
+                    precursor = ProjectApplication.objects.get(id=precursor_application_id)
+                except:
+                    pass
+                application.precursor_application = precursor
+                application.save()
+
+        notification = build_notification(
+            settings.SERVER_EMAIL,
+            [i[1] for i in settings.ADMINS],
+            _(PROJECT_CREATION_SUBJECT) % application.definition.__dict__,
+            template='im/projects/project_creation_notification.txt',
+            dictionary={'object':application}
+        )
+        notification.send()
         return application
 
     def approve(self, approval_user=None):
@@ -1280,13 +1293,12 @@ class ProjectApplication(models.Model):
         self.state = APPROVED
         self.save()
 
-#         self.definition.validate_name()
-
         notification = build_notification(
             settings.SERVER_EMAIL,
             [self.owner.email],
-            _('Project application has been approved on %s alpha2 testing' % SITENAME),
-            _('Your application request %(id)s has been approved.') % self.id
+            _(PROJECT_APPROVED_SUBJECT) % self.definition.__dict__,
+            template='im/projects/project_approval_notification.txt',
+            dictionary={'object':self}
         )
         notification.send()
 
@@ -1445,22 +1457,25 @@ class Project(models.Model):
             self.terminaton_date = datetime.now()
             self.save()
             
-            notification = build_notification(
-                settings.SERVER_EMAIL,
-                [self.application.owner.email],
-                _('Project %(name)s has been terminated.') %  self.definition.__dict__,
-                _('Project %(name)s has been terminated.') %  self.definition.__dict__
-            )
-            notification.send()
+        notification = build_notification(
+            settings.SERVER_EMAIL,
+            [self.application.owner.email],
+            _(PROJECT_TERMINATION_SUBJECT) % self.definition.__dict__,
+            template='im/projects/project_termination_notification.txt',
+            dictionary={'object':self.application}
+        )
+        notification.send()
 
     def suspend(self):
         self.last_approval_date = None
         self.save()
+        self.sync()
         notification = build_notification(
             settings.SERVER_EMAIL,
             [self.application.owner.email],
-            _('Project %(name)s has been suspended.') %  self.definition.__dict__,
-            _('Project %(name)s has been suspended.') %  self.definition.__dict__
+            _(PROJECT_SUSPENSION_SUBJECT) % self.definition.__dict__,
+            template='im/projects/project_suspension_notification.txt',
+            dictionary={'object':self.application}
         )
         notification.send()
 
@@ -1502,8 +1517,9 @@ class ProjectMembership(models.Model):
         notification = build_notification(
             settings.SERVER_EMAIL,
             [self.person.email],
-            _('Your membership on project %(name)s has been accepted.') % self.project.definition.__dict__,
-            _('Your membership on project %(name)s has been accepted.') % self.project.definition.__dict__
+            _(PROJECT_MEMBERSHIP_CHANGE_SUBJECT) % self.project.definition.__dict__,
+            template='im/projects/project_membership_change_notification.txt',
+            dictionary={'object':self.project.application, 'action':'accepted'}
         ).send()
         self.sync()
     
@@ -1530,8 +1546,9 @@ class ProjectMembership(models.Model):
         notification = build_notification(
             settings.SERVER_EMAIL,
             [self.person.email],
-            _('Your membership on project %(name)s has been rejected.') % self.project.definition.__dict__,
-            _('Your membership on project %(name)s has been rejected.') % self.project.definition.__dict__
+            _(PROJECT_MEMBERSHIP_CHANGE_SUBJECT) % self.project.definition.__dict__,
+            template='im/projects/project_membership_change_notification.txt',
+            dictionary={'object':self.project.application, 'action':'rejected'}
         ).send()
     
     def remove(self, request_user=None):
@@ -1558,8 +1575,9 @@ class ProjectMembership(models.Model):
         notification = build_notification(
             settings.SERVER_EMAIL,
             [self.person.email],
-            _('Your membership on project %(name)s has been removed.') % self.project.definition.__dict__,
-            _('Your membership on project %(name)s has been removed.') % self.project.definition.__dict__
+            _(PROJECT_MEMBERSHIP_CHANGE_SUBJECT) % self.project.definition.__dict__,
+            template='im/projects/project_membership_change_notification.txt',
+            dictionary={'object':self.project.application, 'action':'removed'}
         ).send()
         self.sync()
     
index 23a6b0c..dc3c67c 100644 (file)
@@ -39,20 +39,31 @@ from smtplib import SMTPException
 from django.conf import settings
 from django.core.mail import send_mail
 from django.utils.translation import ugettext as _
+from django.template.loader import render_to_string
 
 import astakos.im.messages as astakos_messages
 
 logger = logging.getLogger(__name__)
 
-def build_notification(sender, recipients, subject, message):
-    return EmailNotification(sender, recipients, subject, message)
+def build_notification(
+    sender, recipients, subject, message=None, template=None, dictionary=None
+):
+    return EmailNotification(
+        sender, recipients, subject, message, template, dictionary
+    )
 
 class Notification(object):
-    def __init__(self, sender, recipients, subject, message):
+    def __init__(
+        self, sender, recipients, subject,
+        message=None, template=None, dictionary=None
+    ):
+        if not message and not template:
+            raise InputError('message and template cannot be both None.')
+        dictionary = dictionary or {}
         self.sender = sender
         self.recipients = recipients
         self.subject = subject
-        self.message = message
+        self.message = message or render_to_string(template, dictionary)
     
     def send(self):
         pass
index dc3ac36..bb1baad 100644 (file)
@@ -117,8 +117,9 @@ VERIFICATION_EMAIL_SUBJECT = getattr(
 ACCOUNT_CREATION_SUBJECT = getattr(
     settings, 'ASTAKOS_ACCOUNT_CREATION_SUBJECT',
     '%s alpha2 testing account created (%%(user)s)' % SITENAME)
-GROUP_CREATION_SUBJECT = getattr(settings, 'ASTAKOS_GROUP_CREATION_SUBJECT',
-                                 '%s alpha2 testing group created (%%(group)s)' % SITENAME)
+GROUP_CREATION_SUBJECT = getattr(
+    settings, 'ASTAKOS_GROUP_CREATION_SUBJECT',
+    '%s alpha2 testing group created (%%(group)s)' % SITENAME)
 HELPDESK_NOTIFICATION_EMAIL_SUBJECT = getattr(
     settings, 'ASTAKOS_HELPDESK_NOTIFICATION_EMAIL_SUBJECT',
     '%s alpha2 testing account activated (%%(user)s)' % SITENAME)
@@ -128,6 +129,21 @@ EMAIL_CHANGE_EMAIL_SUBJECT = getattr(
 PASSWORD_RESET_EMAIL_SUBJECT = getattr(
     settings, 'ASTAKOS_PASSWORD_RESET_EMAIL_SUBJECT',
     'Password reset on %s alpha2 testing' % SITENAME)
+PROJECT_CREATION_SUBJECT = getattr(
+    settings, 'ASTAKOS_PROJECT_CREATION_SUBJECT',
+    '%s alpha2 testing project application created (%%(name)s)' % SITENAME)
+PROJECT_APPROVED_SUBJECT = getattr(
+    settings, 'ASTAKOS_PROJECT_APPROVED_SUBJECT',
+    '%s alpha2 testing project application approved (%%(name)s)' % SITENAME)
+PROJECT_TERMINATION_SUBJECT = getattr(
+    settings, 'ASTAKOS_PROJECT_TERMINATION_SUBJECT',
+    '%s alpha2 testing project terminated (%%(name)s)' % SITENAME)
+PROJECT_SUSPENSION_SUBJECT = getattr(
+    settings, 'ASTAKOS_PROJECT_SUSPENSION_SUBJECT',
+    '%s alpha2 testing project suspended (%%(name)s)' % SITENAME)
+PROJECT_MEMBERSHIP_CHANGE_SUBJECT = getattr(
+    settings, 'ASTAKOS_PROJECT_MEMBERSHIP_CHANGE_SUBJECT',
+    '%s alpha2 testing project membership changed (%%(name)s)' % SITENAME)
 
 # Set the quota holder component URI
 QUOTAHOLDER_URL = getattr(settings, 'ASTAKOS_QUOTAHOLDER_URL', '')
index 25763d8..2c2dd21 100644 (file)
@@ -44,7 +44,7 @@ installed_apps = [
     'django.contrib.sessions',
     'django.contrib.messages',
 #    'djcelery',
-#    'debug_toolbar',
+   'debug_toolbar',
 ]
 
 context_processors = [
@@ -69,7 +69,7 @@ middlware_classes = [
     'synnefo.lib.middleware.LoggingConfigMiddleware',
     'synnefo.lib.middleware.SecureMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
-#    'debug_toolbar.middleware.DebugToolbarMiddleware',
+   'debug_toolbar.middleware.DebugToolbarMiddleware',
 ]
 
 loggers = {
@@ -97,4 +97,4 @@ djcelery.setup_loader()
 
 BROKER_URL = ''
 
-# INTERNAL_IPS = ('127.0.0.1',)
+INTERNAL_IPS = ('127.0.0.1',)
diff --git a/snf-astakos-app/astakos/im/templates/im/projects/project_approval_notification.txt b/snf-astakos-app/astakos/im/templates/im/projects/project_approval_notification.txt
new file mode 100644 (file)
index 0000000..17e3c7d
--- /dev/null
@@ -0,0 +1,7 @@
+--- A translation in English follows ---
+
+Η αίτησή σας για το project {{object.definition.name}} έχει γίνει δεκτή.
+
+--
+
+Your project application request ({{object.definition.name}}) has been approved.
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/templates/im/projects/project_creation_notification.txt b/snf-astakos-app/astakos/im/templates/im/projects/project_creation_notification.txt
new file mode 100644 (file)
index 0000000..15665b1
--- /dev/null
@@ -0,0 +1,45 @@
+--- A translation in English follows ---
+
+Έχει δημιουργηθεί το παρακάτω project:
+
+Id:                             {{object.id}}
+Name:                           {{object.definition.name}}
+Issue date:                     {{object.issue_date|date:"d/m/Y"}}
+Start date:                     {{object.definition.start_date|date:"d/m/Y"}}
+End date:                       {{object.definition.end_date|date:"d/m/Y"}}
+Member Join Policy:             {{object.definition.member_join_policy.policy}}
+Member Leave Policy:            {{object.definition.member_leave_policy.policy}}
+Owner:                          {{object.owner}}
+Applicant:                      {{object.applicant}}
+Maximum participant number:     {{object.definition.limit_on_members_number}}
+Precursor:                      {{object.precursor_application.id}}
+Policies:
+{% for p in object.definition.projectresourcegrant_set.all %}
+    {{p.resource}}: uplimit:{% if p.member_limit %}{{p.member_limit}}{% else %}inf{% endif %}
+{% endfor %}
+
+Για την ενεργοποίησή του μπορείτε να χρησιμοποιήσετε το command line εργαλείο:
+snf-manage project-application-approve <id>
+--
+
+The following project has been created:
+
+
+Id:                             {{object.id}}
+Name:                           {{object.definition.name}}
+Issue date:                     {{object.issue_date|date:"d/m/Y"}}
+Start date:                     {{object.definition.start_date|date:"d/m/Y"}}
+End date:                       {{object.definition.end_date|date:"d/m/Y"}}
+Member Join Policy:             {{object.definition.member_join_policy.policy}}
+Member Leave Policy:            {{object.definition.member_leave_policy.policy}}
+Owner:                          {{object.owner}}
+Applicant:                      {{object.applicant}}
+Maximum participant number:     {{object.definition.limit_on_members_number}}
+Precursor:                      {{object.precursor_application.id}}
+Policies:
+{% for p in object.definition.projectresourcegrant_set.all %}
+    {{p.resource}}: uplimit:{% if p.member_limit %}{{p.member_limit}}{% else %}inf{% endif %}
+{% endfor %}
+
+For approving it you can use the command line tool:
+snf-manage project-application-approve <id>
diff --git a/snf-astakos-app/astakos/im/templates/im/projects/project_membership_change_notification.txt b/snf-astakos-app/astakos/im/templates/im/projects/project_membership_change_notification.txt
new file mode 100644 (file)
index 0000000..e0ce170
--- /dev/null
@@ -0,0 +1,14 @@
+--- A translation in English follows ---
+
+{% if action == 'accepted' %}
+Η συμμετοχή σας στο project {{object.definition.name}} έχει γίνει δεκτή.
+{% else %}
+    {% if action == 'rejected' %}
+Η συμμετοχή σας στο project {{object.definition.name}} έχει απορριφθεί.
+    {% else %}
+Η συμμετοχή σας στο project {{object.definition.name}} έχει διαγραφεί.
+    {% endif %}
+{% endif %}
+--
+
+Your project membership ({{object.definition.name}}) has been {{action}}.
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/templates/im/projects/project_suspension_notification.txt b/snf-astakos-app/astakos/im/templates/im/projects/project_suspension_notification.txt
new file mode 100644 (file)
index 0000000..4886242
--- /dev/null
@@ -0,0 +1,7 @@
+--- A translation in English follows ---
+
+Tο project {{object.definition.name}} έχει ανασταλεί.
+
+--
+
+Your project application request ({{object.definition.name}}) has been suspended.
\ No newline at end of file
diff --git a/snf-astakos-app/astakos/im/templates/im/projects/project_termination_notification.txt b/snf-astakos-app/astakos/im/templates/im/projects/project_termination_notification.txt
new file mode 100644 (file)
index 0000000..71a66a7
--- /dev/null
@@ -0,0 +1,7 @@
+--- A translation in English follows ---
+
+Το project {{object.definition.name}} έχει τερματιστεί.
+
+--
+
+Your project application request ({{object.definition.name}}) has been terminated.
\ No newline at end of file
index c70ef77..6d160c3 100644 (file)
 #ASTAKOS_HELPDESK_NOTIFICATION_EMAIL_SUBJECT = '%s alpha2 testing account activated (%%(user)s)' % SITENAME
 #ASTAKOS_EMAIL_CHANGE_EMAIL_SUBJECT = 'Email change on %s alpha2 testing' % SITENAME
 #ASTAKOS_PASSWORD_RESET_EMAIL_SUBJECT = 'Password reset on %s alpha2 testing' % SITENAME
+#ASTAKOS_PROJECT_CREATION_SUBJECT = '%s alpha2 testing project application created (%%(name)s)' % SITENAME
+#ASTAKOS_PROJECT_APPROVED_SUBJECT = '%s alpha2 testing project application approved (%%(name)s)' % SITENAME
+#ASTAKOS_PROJECT_TERMINATION_SUBJECT = '%s alpha2 testing project terminated (%%(name)s)' % SITENAME
+#ASTAKOS_PROJECT_SUSPENSION_SUBJECT = '%s alpha2 testing project suspended (%%(name)s)' % SITENAME
+#ASTAKOS_PROJECT_MEMBERSHIP_CHANGE_SUBJECT = '%s alpha2 testing project membership changed (%%(name)s)' % SITENAME
 
 # Set the quotaholder component URI and token
 #ASTAKOS_QUOTAHOLDER_URL = ''