diff sat/plugins/plugin_misc_account.py @ 2624:56f94936df1e

code style reformatting using black
author Goffi <goffi@goffi.org>
date Wed, 27 Jun 2018 20:14:46 +0200
parents 26edcf3a30eb
children 378188abe941
line wrap: on
line diff
--- a/sat/plugins/plugin_misc_account.py	Wed Jun 27 07:51:29 2018 +0200
+++ b/sat/plugins/plugin_misc_account.py	Wed Jun 27 20:14:46 2018 +0200
@@ -19,6 +19,7 @@
 
 from sat.core.i18n import _, D_
 from sat.core.log import getLogger
+
 log = getLogger(__name__)
 from sat.core import exceptions
 from sat.tools import xml_tools
@@ -31,7 +32,7 @@
 from twisted.words.protocols.jabber import jid
 from sat.tools import email as sat_email
 
-# FIXME: this plugin code is old and need a cleaning
+#  FIXME: this plugin code is old and need a cleaning
 # TODO: account deletion/password change need testing
 
 
@@ -41,10 +42,10 @@
     C.PI_TYPE: "MISC",
     C.PI_PROTOCOLS: [],
     C.PI_DEPENDENCIES: ["XEP-0077"],
-    C.PI_RECOMMENDATIONS: ['GROUPBLOG'],
+    C.PI_RECOMMENDATIONS: ["GROUPBLOG"],
     C.PI_MAIN: "MiscAccount",
     C.PI_HANDLER: "no",
-    C.PI_DESCRIPTION: _(u"""SàT account creation""")
+    C.PI_DESCRIPTION: _(u"""SàT account creation"""),
 }
 
 CONFIG_SECTION = "plugin account"
@@ -53,22 +54,24 @@
 # all theses values (key=option name, value=default) can (and should) be overriden in sat.conf
 # in section CONFIG_SECTION
 
-default_conf = {"email_from": "NOREPLY@example.net",
-                "email_server": "localhost",
-                "email_sender_domain": "",
-                "email_port": 25,
-                "email_username": "",
-                "email_password": "",
-                "email_starttls": "false",
-                "email_auth": "false",
-                "email_admins_list": [],
-                "admin_email": "",
-                "new_account_server": "localhost",
-                "new_account_domain": "",  # use xmpp_domain if not found
-                "reserved_list": ['libervia'] # profiles which can't be used
-               }
+default_conf = {
+    "email_from": "NOREPLY@example.net",
+    "email_server": "localhost",
+    "email_sender_domain": "",
+    "email_port": 25,
+    "email_username": "",
+    "email_password": "",
+    "email_starttls": "false",
+    "email_auth": "false",
+    "email_admins_list": [],
+    "admin_email": "",
+    "new_account_server": "localhost",
+    "new_account_domain": "",  #  use xmpp_domain if not found
+    "reserved_list": ["libervia"],  # profiles which can't be used
+}
 
-WELCOME_MSG = D_(u"""Welcome to Libervia, the web interface of Salut à Toi.
+WELCOME_MSG = D_(
+    u"""Welcome to Libervia, the web interface of Salut à Toi.
 
 Your account on {domain} has been successfully created.
 This is a demonstration version to show you the current status of the project.
@@ -88,55 +91,101 @@
 
 Salut à Toi association
 https://www.salut-a-toi.org
-""")
+"""
+)
 
 DEFAULT_DOMAIN = u"example.net"
 
 
 class MiscAccount(object):
     """Account plugin: create a SàT + XMPP account, used by Libervia"""
+
     # XXX: This plugin was initialy a Q&D one used for the demo.
     # TODO: cleaning, separate email handling, more configuration/tests, fixes
 
-
     def __init__(self, host):
         log.info(_(u"Plugin Account initialization"))
         self.host = host
-        host.bridge.addMethod("registerSatAccount", ".plugin", in_sign='sss', out_sign='', method=self._registerAccount, async=True)
-        host.bridge.addMethod("getNewAccountDomain", ".plugin", in_sign='', out_sign='s', method=self.getNewAccountDomain, async=False)
-        host.bridge.addMethod("getAccountDialogUI", ".plugin", in_sign='s', out_sign='s', method=self._getAccountDialogUI, async=False)
-        host.bridge.addMethod("asyncConnectWithXMPPCredentials", ".plugin", in_sign='ss', out_sign='b', method=self.asyncConnectWithXMPPCredentials, async=True)
+        host.bridge.addMethod(
+            "registerSatAccount",
+            ".plugin",
+            in_sign="sss",
+            out_sign="",
+            method=self._registerAccount,
+            async=True,
+        )
+        host.bridge.addMethod(
+            "getNewAccountDomain",
+            ".plugin",
+            in_sign="",
+            out_sign="s",
+            method=self.getNewAccountDomain,
+            async=False,
+        )
+        host.bridge.addMethod(
+            "getAccountDialogUI",
+            ".plugin",
+            in_sign="s",
+            out_sign="s",
+            method=self._getAccountDialogUI,
+            async=False,
+        )
+        host.bridge.addMethod(
+            "asyncConnectWithXMPPCredentials",
+            ".plugin",
+            in_sign="ss",
+            out_sign="b",
+            method=self.asyncConnectWithXMPPCredentials,
+            async=True,
+        )
 
         self.fixEmailAdmins()
         self._sessions = Sessions()
 
-        self.__account_cb_id = host.registerCallback(self._accountDialogCb, with_data=True)
-        self.__change_password_id = host.registerCallback(self.__changePasswordCb, with_data=True)
+        self.__account_cb_id = host.registerCallback(
+            self._accountDialogCb, with_data=True
+        )
+        self.__change_password_id = host.registerCallback(
+            self.__changePasswordCb, with_data=True
+        )
 
         def deleteBlogCallback(posts, comments):
-            return lambda data, profile: self.__deleteBlogPostsCb(posts, comments, data, profile)
+            return lambda data, profile: self.__deleteBlogPostsCb(
+                posts, comments, data, profile
+            )
 
-        self.__delete_posts_id = host.registerCallback(deleteBlogCallback(True, False), with_data=True)
-        self.__delete_comments_id = host.registerCallback(deleteBlogCallback(False, True), with_data=True)
-        self.__delete_posts_comments_id = host.registerCallback(deleteBlogCallback(True, True), with_data=True)
+        self.__delete_posts_id = host.registerCallback(
+            deleteBlogCallback(True, False), with_data=True
+        )
+        self.__delete_comments_id = host.registerCallback(
+            deleteBlogCallback(False, True), with_data=True
+        )
+        self.__delete_posts_comments_id = host.registerCallback(
+            deleteBlogCallback(True, True), with_data=True
+        )
 
-        self.__delete_account_id = host.registerCallback(self.__deleteAccountCb, with_data=True)
-
+        self.__delete_account_id = host.registerCallback(
+            self.__deleteAccountCb, with_data=True
+        )
 
     # FIXME: remove this after some time, when the deprecated parameter is really abandoned
     def fixEmailAdmins(self):
         """Handle deprecated config option "admin_email" to fix the admin emails list"""
-        admin_email = self.getConfig('admin_email')
+        admin_email = self.getConfig("admin_email")
         if not admin_email:
             return
-        log.warning(u"admin_email parameter is deprecated, please use email_admins_list instead")
+        log.warning(
+            u"admin_email parameter is deprecated, please use email_admins_list instead"
+        )
         param_name = "email_admins_list"
         try:
             section = ""
             value = self.host.memory.getConfig(section, param_name, Exception)
         except (ConfigParser.NoOptionError, ConfigParser.NoSectionError):
             section = CONFIG_SECTION
-            value = self.host.memory.getConfig(section, param_name, default_conf[param_name])
+            value = self.host.memory.getConfig(
+                section, param_name, default_conf[param_name]
+            )
 
         value = set(value)
         value.add(admin_email)
@@ -193,7 +242,7 @@
         if not password or not profile:
             raise exceptions.DataError
 
-        if profile.lower() in self.getConfig('reserved_list'):
+        if profile.lower() in self.getConfig("reserved_list"):
             return defer.fail(Failure(exceptions.ConflictError))
 
         d = self.host.memory.createProfile(profile, password)
@@ -216,11 +265,15 @@
         else:
             jid_s = profile + u"@" + self.getNewAccountDomain()
             jid_ = jid.JID(jid_s)
-            d = self.host.plugins['XEP-0077'].registerNewAccount(jid_, password)
+            d = self.host.plugins["XEP-0077"].registerNewAccount(jid_, password)
 
         def setParams(dummy):
-            self.host.memory.setParam("JabberID", jid_s, "Connection", profile_key=profile)
-            d = self.host.memory.setParam("Password", password, "Connection", profile_key=profile)
+            self.host.memory.setParam(
+                "JabberID", jid_s, "Connection", profile_key=profile
+            )
+            d = self.host.memory.setParam(
+                "Password", password, "Connection", profile_key=profile
+            )
             return d
 
         def removeProfile(failure):
@@ -235,9 +288,11 @@
 
     def _sendEmailEb(self, failure_, email):
         # TODO: return error code to user
-        log.error(_(u"Failed to send account creation confirmation to {email}: {msg}").format(
-            email = email,
-            msg = failure_))
+        log.error(
+            _(u"Failed to send account creation confirmation to {email}: {msg}").format(
+                email=email, msg=failure_
+            )
+        )
 
     def sendEmails(self, email, profile):
         # time to send the email
@@ -245,43 +300,68 @@
         domain = self.getNewAccountDomain()
 
         # email to the administrators
-        admins_emails = self.getConfig('email_admins_list')
+        admins_emails = self.getConfig("email_admins_list")
         if not admins_emails:
-            log.warning(u"No known admin email, we can't send email to administrator(s).\nPlease fill email_admins_list parameter")
+            log.warning(
+                u"No known admin email, we can't send email to administrator(s).\nPlease fill email_admins_list parameter"
+            )
             d_admin = defer.fail(exceptions.DataError("no admin email"))
         else:
-            subject = _(u'New Libervia account created')
-            body = (u"""New account created: {profile} [{email}]""".format(
-                profile = profile,
+            subject = _(u"New Libervia account created")
+            body = u"""New account created: {profile} [{email}]""".format(
+                profile=profile,
                 # there is no email when an existing XMPP account is used
-                email = email or u"<no email>"))
+                email=email or u"<no email>",
+            )
             d_admin = sat_email.sendEmail(self.host, admins_emails, subject, body)
 
-        admins_emails_txt = u', '.join([u'<' + addr + u'>' for addr in admins_emails])
-        d_admin.addCallbacks(lambda dummy: log.debug(u"Account creation notification sent to admin(s) {}".format(admins_emails_txt)),
-                             lambda dummy: log.error(u"Failed to send account creation notification to admin {}".format(admins_emails_txt)))
+        admins_emails_txt = u", ".join([u"<" + addr + u">" for addr in admins_emails])
+        d_admin.addCallbacks(
+            lambda dummy: log.debug(
+                u"Account creation notification sent to admin(s) {}".format(
+                    admins_emails_txt
+                )
+            ),
+            lambda dummy: log.error(
+                u"Failed to send account creation notification to admin {}".format(
+                    admins_emails_txt
+                )
+            ),
+        )
         if not email:
             # TODO: if use register with an existing account, an XMPP message should be sent
             return d_admin
 
-        jid_s = self.host.memory.getParamA(u"JabberID", u"Connection", profile_key=profile)
-        subject = _(u'Your Libervia account has been created')
-        body = (_(WELCOME_MSG).format(profile=profile, jid=jid_s, domain=domain))
+        jid_s = self.host.memory.getParamA(
+            u"JabberID", u"Connection", profile_key=profile
+        )
+        subject = _(u"Your Libervia account has been created")
+        body = _(WELCOME_MSG).format(profile=profile, jid=jid_s, domain=domain)
 
         # XXX: this will not fail when the email address doesn't exist
         # FIXME: check email reception to validate email given by the user
         # FIXME: delete the profile if the email could not been sent?
         d_user = sat_email.sendEmail(self.host, [email], subject, body)
-        d_user.addCallbacks(lambda dummy: log.debug(u"Account creation confirmation sent to <{}>".format(email)),
-                            self._sendEmailEb)
+        d_user.addCallbacks(
+            lambda dummy: log.debug(
+                u"Account creation confirmation sent to <{}>".format(email)
+            ),
+            self._sendEmailEb,
+        )
         return defer.DeferredList([d_user, d_admin])
 
     def getNewAccountDomain(self):
         """get the domain that will be set to new account"""
 
-        domain = self.getConfig('new_account_domain') or self.getConfig('xmpp_domain', None)
+        domain = self.getConfig("new_account_domain") or self.getConfig(
+            "xmpp_domain", None
+        )
         if not domain:
-            log.warning(_(u'xmpp_domain needs to be set in sat.conf. Using "{default}" meanwhile').format(default=DEFAULT_DOMAIN))
+            log.warning(
+                _(
+                    u'xmpp_domain needs to be set in sat.conf. Using "{default}" meanwhile'
+                ).format(default=DEFAULT_DOMAIN)
+            )
             return DEFAULT_DOMAIN
         return domain
 
@@ -291,10 +371,17 @@
         @param profile: %(doc_profile)s
         @return: XML of the dialog
         """
-        form_ui = xml_tools.XMLUI("form", "tabs", title=D_("Manage your account"), submit_id=self.__account_cb_id)
+        form_ui = xml_tools.XMLUI(
+            "form",
+            "tabs",
+            title=D_("Manage your account"),
+            submit_id=self.__account_cb_id,
+        )
         tab_container = form_ui.current_container
 
-        tab_container.addTab("update", D_("Change your password"), container=xml_tools.PairsContainer)
+        tab_container.addTab(
+            "update", D_("Change your password"), container=xml_tools.PairsContainer
+        )
         form_ui.addLabel(D_("Current profile password"))
         form_ui.addPassword("current_passwd", value="")
         form_ui.addLabel(D_("New password"))
@@ -328,7 +415,9 @@
         @param data
         @param profile
         """
-        sat_cipher = yield self.host.memory.asyncGetParamA(C.PROFILE_PASS_PATH[1], C.PROFILE_PASS_PATH[0], profile_key=profile)
+        sat_cipher = yield self.host.memory.asyncGetParamA(
+            C.PROFILE_PASS_PATH[1], C.PROFILE_PASS_PATH[0], profile_key=profile
+        )
 
         @defer.inlineCallbacks
         def verify(attempt):
@@ -340,7 +429,7 @@
                 message = D_("The provided profile password doesn't match.")
             error_ui = xml_tools.XMLUI("popup", title=D_("Attempt failure"))
             error_ui.addText(message)
-            return {'xmlui': error_ui.toXml()}
+            return {"xmlui": error_ui.toXml()}
 
         # check for account deletion
         # FIXME: uncomment and fix these features
@@ -370,9 +459,9 @@
         """
 
         # check for password modification
-        current_passwd = data[xml_tools.SAT_FORM_PREFIX + 'current_passwd']
-        new_passwd1 = data[xml_tools.SAT_FORM_PREFIX + 'new_passwd1']
-        new_passwd2 = data[xml_tools.SAT_FORM_PREFIX + 'new_passwd2']
+        current_passwd = data[xml_tools.SAT_FORM_PREFIX + "current_passwd"]
+        new_passwd1 = data[xml_tools.SAT_FORM_PREFIX + "new_passwd1"]
+        new_passwd2 = data[xml_tools.SAT_FORM_PREFIX + "new_passwd2"]
         if new_passwd1 or new_passwd2:
             verified = yield verify(current_passwd)
             assert isinstance(verified, bool)
@@ -381,7 +470,11 @@
                     data = yield self.__changePassword(new_passwd1, profile=profile)
                     defer.returnValue(data)
                 else:
-                    defer.returnValue(error_ui(D_("The values entered for the new password are not equal.")))
+                    defer.returnValue(
+                        error_ui(
+                            D_("The values entered for the new password are not equal.")
+                        )
+                    )
             defer.returnValue(error_ui())
 
         defer.returnValue({})
@@ -392,11 +485,22 @@
         @param password (str): the new password
         @param profile (str): %(doc_profile)s
         """
-        session_id, dummy = self._sessions.newSession({'new_password': password}, profile=profile)
-        form_ui = xml_tools.XMLUI("form", title=D_("Change your password?"), submit_id=self.__change_password_id, session_id=session_id)
-        form_ui.addText(D_("Note for advanced users: this will actually change both your SàT profile password AND your XMPP account password."))
+        session_id, dummy = self._sessions.newSession(
+            {"new_password": password}, profile=profile
+        )
+        form_ui = xml_tools.XMLUI(
+            "form",
+            title=D_("Change your password?"),
+            submit_id=self.__change_password_id,
+            session_id=session_id,
+        )
+        form_ui.addText(
+            D_(
+                "Note for advanced users: this will actually change both your SàT profile password AND your XMPP account password."
+            )
+        )
         form_ui.addText(D_("Continue with changing the password?"))
-        return {'xmlui': form_ui.toXml()}
+        return {"xmlui": form_ui.toXml()}
 
     def __changePasswordCb(self, data, profile):
         """Actually change the user XMPP account and SàT profile password
@@ -404,22 +508,33 @@
         @profile (str): %(doc_profile)s
         """
         client = self.host.getClient(profile)
-        password = self._sessions.profileGet(data['session_id'], profile)['new_password']
-        del self._sessions[data['session_id']]
+        password = self._sessions.profileGet(data["session_id"], profile)["new_password"]
+        del self._sessions[data["session_id"]]
 
         def passwordChanged(dummy):
-            d = self.host.memory.setParam(C.PROFILE_PASS_PATH[1], password, C.PROFILE_PASS_PATH[0], profile_key=profile)
-            d.addCallback(lambda dummy: self.host.memory.setParam("Password", password, "Connection", profile_key=profile))
+            d = self.host.memory.setParam(
+                C.PROFILE_PASS_PATH[1],
+                password,
+                C.PROFILE_PASS_PATH[0],
+                profile_key=profile,
+            )
+            d.addCallback(
+                lambda dummy: self.host.memory.setParam(
+                    "Password", password, "Connection", profile_key=profile
+                )
+            )
             confirm_ui = xml_tools.XMLUI("popup", title=D_("Confirmation"))
             confirm_ui.addText(D_("Your password has been changed."))
-            return defer.succeed({'xmlui': confirm_ui.toXml()})
+            return defer.succeed({"xmlui": confirm_ui.toXml()})
 
         def errback(failure):
             error_ui = xml_tools.XMLUI("popup", title=D_("Error"))
-            error_ui.addText(D_("Your password could not be changed: %s") % failure.getErrorMessage())
-            return defer.succeed({'xmlui': error_ui.toXml()})
+            error_ui.addText(
+                D_("Your password could not be changed: %s") % failure.getErrorMessage()
+            )
+            return defer.succeed({"xmlui": error_ui.toXml()})
 
-        d = self.host.plugins['XEP-0077'].changePassword(client, password)
+        d = self.host.plugins["XEP-0077"].changePassword(client, password)
         d.addCallbacks(passwordChanged, errback)
         return d
 
@@ -427,12 +542,31 @@
         """Ask for a confirmation before deleting the XMPP account and SàT profile
         @param profile
         """
-        form_ui = xml_tools.XMLUI("form", title=D_("Delete your account?"), submit_id=self.__delete_account_id)
-        form_ui.addText(D_("If you confirm this dialog, you will be disconnected and then your XMPP account AND your SàT profile will both be DELETED."))
-        target = D_('contact list, messages history, blog posts and comments' if 'GROUPBLOG' in self.host.plugins else D_('contact list and messages history'))
-        form_ui.addText(D_("All your data stored on %(server)s, including your %(target)s will be erased.") % {'server': self.getNewAccountDomain(), 'target': target})
-        form_ui.addText(D_("There is no other confirmation dialog, this is the very last one! Are you sure?"))
-        return {'xmlui': form_ui.toXml()}
+        form_ui = xml_tools.XMLUI(
+            "form", title=D_("Delete your account?"), submit_id=self.__delete_account_id
+        )
+        form_ui.addText(
+            D_(
+                "If you confirm this dialog, you will be disconnected and then your XMPP account AND your SàT profile will both be DELETED."
+            )
+        )
+        target = D_(
+            "contact list, messages history, blog posts and comments"
+            if "GROUPBLOG" in self.host.plugins
+            else D_("contact list and messages history")
+        )
+        form_ui.addText(
+            D_(
+                "All your data stored on %(server)s, including your %(target)s will be erased."
+            )
+            % {"server": self.getNewAccountDomain(), "target": target}
+        )
+        form_ui.addText(
+            D_(
+                "There is no other confirmation dialog, this is the very last one! Are you sure?"
+            )
+        )
+        return {"xmlui": form_ui.toXml()}
 
     def __deleteAccountCb(self, data, profile):
         """Actually delete the XMPP account and SàT profile
@@ -441,18 +575,25 @@
         @param profile
         """
         client = self.host.getClient(profile)
+
         def userDeleted(dummy):
 
             # FIXME: client should be disconnected at this point, so 2 next loop should be removed (to be confirmed)
             for jid_ in client.roster._jids:  # empty roster
                 client.presence.unsubscribe(jid_)
 
-            for jid_ in self.host.memory.getWaitingSub(profile):  # delete waiting subscriptions
+            for jid_ in self.host.memory.getWaitingSub(
+                profile
+            ):  # delete waiting subscriptions
                 self.host.memory.delWaitingSub(jid_)
 
-            delete_profile = lambda: self.host.memory.asyncDeleteProfile(profile, force=True)
-            if 'GROUPBLOG' in self.host.plugins:
-                d = self.host.plugins['GROUPBLOG'].deleteAllGroupBlogsAndComments(profile_key=profile)
+            delete_profile = lambda: self.host.memory.asyncDeleteProfile(
+                profile, force=True
+            )
+            if "GROUPBLOG" in self.host.plugins:
+                d = self.host.plugins["GROUPBLOG"].deleteAllGroupBlogsAndComments(
+                    profile_key=profile
+                )
                 d.addCallback(lambda dummy: delete_profile())
             else:
                 delete_profile()
@@ -461,10 +602,13 @@
 
         def errback(failure):
             error_ui = xml_tools.XMLUI("popup", title=D_("Error"))
-            error_ui.addText(D_("Your XMPP account could not be deleted: %s") % failure.getErrorMessage())
-            return defer.succeed({'xmlui': error_ui.toXml()})
+            error_ui.addText(
+                D_("Your XMPP account could not be deleted: %s")
+                % failure.getErrorMessage()
+            )
+            return defer.succeed({"xmlui": error_ui.toXml()})
 
-        d = self.host.plugins['XEP-0077'].unregister(client, jid.JID(client.jid.host))
+        d = self.host.plugins["XEP-0077"].unregister(client, jid.JID(client.jid.host))
         d.addCallbacks(userDeleted, errback)
         return d
 
@@ -477,20 +621,60 @@
         """
         if posts:
             if comments:  # delete everything
-                form_ui = xml_tools.XMLUI("form", title=D_("Delete all your (micro-)blog posts and comments?"), submit_id=self.__delete_posts_comments_id)
-                form_ui.addText(D_("If you confirm this dialog, all the (micro-)blog data you submitted will be erased."))
-                form_ui.addText(D_("These are the public and private posts and comments you sent to any group."))
-                form_ui.addText(D_("There is no other confirmation dialog, this is the very last one! Are you sure?"))
+                form_ui = xml_tools.XMLUI(
+                    "form",
+                    title=D_("Delete all your (micro-)blog posts and comments?"),
+                    submit_id=self.__delete_posts_comments_id,
+                )
+                form_ui.addText(
+                    D_(
+                        "If you confirm this dialog, all the (micro-)blog data you submitted will be erased."
+                    )
+                )
+                form_ui.addText(
+                    D_(
+                        "These are the public and private posts and comments you sent to any group."
+                    )
+                )
+                form_ui.addText(
+                    D_(
+                        "There is no other confirmation dialog, this is the very last one! Are you sure?"
+                    )
+                )
             else:  # delete only the posts
-                form_ui = xml_tools.XMLUI("form", title=D_("Delete all your (micro-)blog posts?"), submit_id=self.__delete_posts_id)
-                form_ui.addText(D_("If you confirm this dialog, all the public and private posts you sent to any group will be erased."))
-                form_ui.addText(D_("There is no other confirmation dialog, this is the very last one! Are you sure?"))
+                form_ui = xml_tools.XMLUI(
+                    "form",
+                    title=D_("Delete all your (micro-)blog posts?"),
+                    submit_id=self.__delete_posts_id,
+                )
+                form_ui.addText(
+                    D_(
+                        "If you confirm this dialog, all the public and private posts you sent to any group will be erased."
+                    )
+                )
+                form_ui.addText(
+                    D_(
+                        "There is no other confirmation dialog, this is the very last one! Are you sure?"
+                    )
+                )
         elif comments:  # delete only the comments
-            form_ui = xml_tools.XMLUI("form", title=D_("Delete all your (micro-)blog comments?"), submit_id=self.__delete_comments_id)
-            form_ui.addText(D_("If you confirm this dialog, all the public and private comments you made on other people's posts will be erased."))
-            form_ui.addText(D_("There is no other confirmation dialog, this is the very last one! Are you sure?"))
+            form_ui = xml_tools.XMLUI(
+                "form",
+                title=D_("Delete all your (micro-)blog comments?"),
+                submit_id=self.__delete_comments_id,
+            )
+            form_ui.addText(
+                D_(
+                    "If you confirm this dialog, all the public and private comments you made on other people's posts will be erased."
+                )
+            )
+            form_ui.addText(
+                D_(
+                    "There is no other confirmation dialog, this is the very last one! Are you sure?"
+                )
+            )
 
-        return {'xmlui': form_ui.toXml()}
+        return {"xmlui": form_ui.toXml()}
 
     def __deleteBlogPostsCb(self, posts, comments, data, profile):
         """Actually delete the XMPP account and SàT profile
@@ -500,26 +684,39 @@
         """
         if posts:
             if comments:
-                target = D_('blog posts and comments')
-                d = self.host.plugins['GROUPBLOG'].deleteAllGroupBlogsAndComments(profile_key=profile)
+                target = D_("blog posts and comments")
+                d = self.host.plugins["GROUPBLOG"].deleteAllGroupBlogsAndComments(
+                    profile_key=profile
+                )
             else:
-                target = D_('blog posts')
-                d = self.host.plugins['GROUPBLOG'].deleteAllGroupBlogs(profile_key=profile)
+                target = D_("blog posts")
+                d = self.host.plugins["GROUPBLOG"].deleteAllGroupBlogs(
+                    profile_key=profile
+                )
         elif comments:
-            target = D_('comments')
-            d = self.host.plugins['GROUPBLOG'].deleteAllGroupBlogsComments(profile_key=profile)
+            target = D_("comments")
+            d = self.host.plugins["GROUPBLOG"].deleteAllGroupBlogsComments(
+                profile_key=profile
+            )
 
         def deleted(result):
             ui = xml_tools.XMLUI("popup", title=D_("Deletion confirmation"))
             # TODO: change the message when delete/retract notifications are done with XEP-0060
-            ui.addText(D_("Your %(target)s have been deleted.") % {'target': target})
-            ui.addText(D_("Known issue of the demo version: you need to refresh the page to make the deleted posts actually disappear."))
-            return defer.succeed({'xmlui': ui.toXml()})
+            ui.addText(D_("Your %(target)s have been deleted.") % {"target": target})
+            ui.addText(
+                D_(
+                    "Known issue of the demo version: you need to refresh the page to make the deleted posts actually disappear."
+                )
+            )
+            return defer.succeed({"xmlui": ui.toXml()})
 
         def errback(failure):
             error_ui = xml_tools.XMLUI("popup", title=D_("Error"))
-            error_ui.addText(D_("Your %(target)s could not be deleted: %(message)s") % {'target': target, 'message': failure.getErrorMessage()})
-            return defer.succeed({'xmlui': error_ui.toXml()})
+            error_ui.addText(
+                D_("Your %(target)s could not be deleted: %(message)s")
+                % {"target": target, "message": failure.getErrorMessage()}
+            )
+            return defer.succeed({"xmlui": error_ui.toXml()})
 
         d.addCallbacks(deleted, errback)
         return d
@@ -541,16 +738,21 @@
             raise exceptions.ConflictError
 
         d = self.createProfile(password, jid_s, jid_s)
-        d.addCallback(lambda dummy: self.host.memory.getProfileName(jid_s))  # checks if the profile has been successfuly created
+        d.addCallback(
+            lambda dummy: self.host.memory.getProfileName(jid_s)
+        )  # checks if the profile has been successfuly created
         d.addCallback(self.host.connect, password, {}, 0)
 
-
         def connected(result):
             self.sendEmails(None, profile=jid_s)
             return result
 
-        def removeProfile(failure):  # profile has been successfully created but the XMPP credentials are wrong!
-            log.debug("Removing previously auto-created profile: %s" % failure.getErrorMessage())
+        def removeProfile(
+            failure
+        ):  # profile has been successfully created but the XMPP credentials are wrong!
+            log.debug(
+                "Removing previously auto-created profile: %s" % failure.getErrorMessage()
+            )
             self.host.memory.asyncDeleteProfile(jid_s)
             raise failure