Luke Plant avatar Luke Plant committed 67d23a4

Added trigger to update home group lists on webfaction

Comments (0)

Files changed (4)

christchurch/settings.py

 
     SEND_BROKEN_LINK_EMAILS = False
 
+## WEBFACTION API
+
+from .settings_priv import WEBFACTION_USER, WEBFACTION_PASSWORD
 
 SEMANTICEDITOR_MEDIA_URL = os.path.join(STATIC_URL, "semanticeditor/")
 

contacts/lists.py

+from contacts.webfaction import webfaction_session
+
+
+def update_home_group_lists(*args, **kwargs):
+    from .models import HomeGroup
+
+    s = webfaction_session()
+    if s is None:
+        # This happens during development
+        return
+
+    for hg in HomeGroup.objects.exclude(group_email=''):
+        if hg.group_email != '':
+            email_list = list(set([c.email for c in hg.contact_set.exclude(email='')]))
+            s.update_email(hg.group_email, ', '.join(email_list))
+

contacts/models.py

 
     class Meta:
         ordering = ['name']
+
+
+# Signals:
+from django.db.models.signals import post_save
+from .lists import update_home_group_lists
+
+post_save.connect(update_home_group_lists, sender=Contact)

contacts/webfaction.py

+import xmlrpclib
+from django.conf import settings
+
+
+# See http://docs.webfaction.com/xmlrpc-api/
+class WebFactionSession(object):
+    """
+    Class that wraps xmlrpc server calls to always
+    provide the webfaction session id as the first
+    parameter to method calls
+    """
+    def __init__(self, server, session_id):
+        self.server = server
+        self.session_id = session_id
+
+    def __getattr__(self, name):
+        def func(*args):
+            f = getattr(self.server, name)
+            return f(self.session_id, *args)
+        return func
+
+
+def webfaction_session():
+    if settings.WEBFACTION_USER is None:
+        return None
+    server = xmlrpclib.Server('https://api.webfaction.com/')
+    session_id, account = server.login(settings.WEBFACTION_USER, settings.WEBFACTION_PASSWORD)
+    return WebFactionSession(server, session_id)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.