Commit d60f7752 authored by Sylvain Thénault's avatar Sylvain Thénault
Browse files

backport stable

......@@ -18,3 +18,5 @@ c5ef2aca958c4ea042f28cc279f41a2a0fbcc1e3 cubicweb-email-version-1.8.0
41366e43985e9021b2414167bb413b50dd95c9da cubicweb-email-debian-version-1.8.0-1
ab3a1524c0230c80ca5e74e7ba0120978be8004c cubicweb-email-version-1.8.1
ed2720db906a426992fcd8435c0c161abff10f00 cubicweb-email-debian-version-1.8.1-1
c41f2e137bda9579b606d0b95d24153493044f48 cubicweb-email-version-1.8.2
590c68b7c579b202cf8e695a0a3809825906c272 cubicweb-email-debian-version-1.8.2-1
......@@ -4,7 +4,7 @@
modname = 'email'
distname = "cubicweb-%s" % modname
numversion = (1, 8, 1)
numversion = (1, 8, 2)
version = '.'.join(str(num) for num in numversion)
license = 'LGPL'
......
"""cubicweb-ctl plugin providing the mboximport command
:organization: Logilab
:copyright: 2007-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
:copyright: 2007-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
"""
__docformat__ = "restructuredtext en"
......@@ -34,15 +34,21 @@ class MBOXImportCommand(Command):
'default': False,
'help': 'ask confirmation to continue after an error.',
}),
("skip-sign",
{'short': 's', 'action' : 'store_true',
'default': False,
'help': 'skip email signature.',
}),
)
def run(self, args):
"""run the command with its specific arguments"""
appid = args.pop()
appid = args.pop(0)
cnx = config_connect(appid, self.config)
cnx.load_appobjects(cubes=None, subpath=('entities',))
importer = MBOXImporter(cnx, verbose=True,
interactive=self.config.interactive)
interactive=self.config.interactive,
skipsign=self.config.skip_sign)
# set autocommit, add an option to control that if needed
importer.autocommit_mode()
try:
......
cubicweb-email (1.8.2-1) unstable; urgency=low
* new upstream release
-- Sylvain Thénault <sylvain.thenault@logilab.fr> Tue, 05 Oct 2010 08:41:10 +0200
cubicweb-email (1.8.1-1) unstable; urgency=low
* new upstream release
......
......@@ -7,6 +7,7 @@ msgstr ""
"PO-Revision-Date: 2008-02-15 10:49+0100\n"
"Last-Translator: Logilab Team <contact@logilab.fr>\n"
"Language-Team: en <contact@logilab.fr>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
......@@ -97,12 +98,12 @@ msgctxt "Email"
msgid "attachment"
msgstr ""
msgctxt "File"
msgid "attachment_object"
msgstr "attachement of"
msgstr "attachment of"
msgctxt "File"
msgid "attachment_object"
msgstr "attachment of"
msgstr "attachement of"
msgid "cc"
msgstr ""
......@@ -111,10 +112,10 @@ msgctxt "Email"
msgid "cc"
msgstr ""
msgctxt "EmailAddress"
msgid "cc_object"
msgstr "cc"
msgctxt "EmailAddress"
msgid "cc_object"
msgstr "cc"
......@@ -125,10 +126,10 @@ msgctxt "Email"
msgid "cites"
msgstr ""
msgctxt "Email"
msgid "cites_object"
msgstr "cited by"
msgctxt "Email"
msgid "cites_object"
msgstr "cited by"
......@@ -178,10 +179,10 @@ msgctxt "EmailThread"
msgid "forked_from"
msgstr "forked from"
msgctxt "EmailThread"
msgid "forked_from_object"
msgstr "forks"
msgctxt "EmailThread"
msgid "forked_from_object"
msgstr "forks"
......@@ -196,10 +197,10 @@ msgctxt "TrInfo"
msgid "generated_by"
msgstr "generated by"
msgctxt "Email"
msgid "generated_by_object"
msgstr "has generated"
msgctxt "Email"
msgid "generated_by_object"
msgstr "has generated"
......@@ -217,10 +218,10 @@ msgctxt "Email"
msgid "in_thread"
msgstr "in thread"
msgctxt "EmailThread"
msgid "in_thread_object"
msgstr "contains"
msgctxt "EmailThread"
msgid "in_thread_object"
msgstr "contains"
......@@ -254,10 +255,10 @@ msgctxt "Email"
msgid "parts"
msgstr ""
msgctxt "EmailPart"
msgid "parts_object"
msgstr "part of"
msgctxt "EmailPart"
msgid "parts_object"
msgstr "part of"
......@@ -271,10 +272,10 @@ msgctxt "Email"
msgid "recipients"
msgstr ""
msgctxt "EmailAddress"
msgid "recipients_object"
msgstr "recipient of"
msgctxt "EmailAddress"
msgid "recipients_object"
msgstr "recipient of"
......@@ -285,10 +286,10 @@ msgctxt "Email"
msgid "reply_to"
msgstr "in reply to"
msgctxt "Email"
msgid "reply_to_object"
msgstr "reply"
msgctxt "Email"
msgid "reply_to_object"
msgstr "reply"
......@@ -303,10 +304,10 @@ msgctxt "Email"
msgid "sender"
msgstr ""
msgctxt "EmailAddress"
msgid "sender_object"
msgstr "has sent"
msgctxt "EmailAddress"
msgid "sender_object"
msgstr "has sent"
......
......@@ -7,6 +7,7 @@ msgstr ""
"PO-Revision-Date: 2008-08-07 16:30+0200\n"
"Last-Translator: Logilab Team <contact@logilab.fr>\n"
"Language-Team: fr <contact@logilab.fr>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
......@@ -97,12 +98,12 @@ msgctxt "Email"
msgid "attachment"
msgstr "pièce jointe"
msgctxt "File"
msgid "attachment_object"
msgstr "pièce jointe"
msgstr "pièce jointe de"
msgctxt "File"
msgid "attachment_object"
msgstr "pièce jointe de"
msgstr "pièce jointe"
msgid "cc"
msgstr "cc"
......@@ -111,10 +112,10 @@ msgctxt "Email"
msgid "cc"
msgstr "cc"
msgctxt "EmailAddress"
msgid "cc_object"
msgstr "cc"
msgctxt "EmailAddress"
msgid "cc_object"
msgstr "cc"
......@@ -125,10 +126,10 @@ msgctxt "Email"
msgid "cites"
msgstr "cite"
msgctxt "Email"
msgid "cites_object"
msgstr "cité par"
msgctxt "Email"
msgid "cites_object"
msgstr "cité par"
......@@ -178,10 +179,10 @@ msgctxt "EmailThread"
msgid "forked_from"
msgstr "branche de"
msgctxt "EmailThread"
msgid "forked_from_object"
msgstr "a pour branches"
msgctxt "EmailThread"
msgid "forked_from_object"
msgstr "a pour branches"
......@@ -196,10 +197,10 @@ msgctxt "TrInfo"
msgid "generated_by"
msgstr "généré par"
msgctxt "Email"
msgid "generated_by_object"
msgstr "a généré"
msgctxt "Email"
msgid "generated_by_object"
msgstr "a généré"
......@@ -217,10 +218,10 @@ msgctxt "Email"
msgid "in_thread"
msgstr "dans l'enfilade"
msgctxt "EmailThread"
msgid "in_thread_object"
msgstr "contient"
msgctxt "EmailThread"
msgid "in_thread_object"
msgstr "contient"
......@@ -254,10 +255,10 @@ msgctxt "Email"
msgid "parts"
msgstr "parties"
msgctxt "EmailPart"
msgid "parts_object"
msgstr "contenu de"
msgctxt "EmailPart"
msgid "parts_object"
msgstr "contenu de"
......@@ -271,10 +272,10 @@ msgctxt "Email"
msgid "recipients"
msgstr "destinataires"
msgctxt "EmailAddress"
msgid "recipients_object"
msgstr "destinataires de"
msgctxt "EmailAddress"
msgid "recipients_object"
msgstr "destinataires de"
......@@ -285,10 +286,10 @@ msgctxt "Email"
msgid "reply_to"
msgstr "en réponse à"
msgctxt "Email"
msgid "reply_to_object"
msgstr "a pour réponse"
msgctxt "Email"
msgid "reply_to_object"
msgstr "a pour réponse"
......@@ -303,10 +304,10 @@ msgctxt "Email"
msgid "sender"
msgstr "expéditeur"
msgctxt "EmailAddress"
msgid "sender_object"
msgstr "a envoyé"
msgctxt "EmailAddress"
msgid "sender_object"
msgstr "a envoyé"
......
"""import an mbox or a single email into an cubicweb application
:organization: Logilab
:copyright: 2007-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
:copyright: 2007-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
"""
__docformat__ = "restructuredtext en"
......@@ -36,14 +36,14 @@ def combinaison(list):
class MBOXImporter(object):
"""import content of a Unix mailbox into cubicweb as Email (and related) objects"""
def __init__(self, cnx,
verbose=False, interactive=False):
def __init__(self, cnx, verbose=False, interactive=False, skipsign=False):
self.cnx = cnx
self.schema = cnx.get_schema()
self.req = cnx.request()
self.execute = self.req.execute
self._verbose = verbose
self._interactive = interactive
self._skipsign = skipsign
self.created = {}
self.skipped = []
self.error = []
......@@ -166,6 +166,8 @@ class MBOXImporter(object):
if main == 'text':
encoding = u'UTF-8'
elif contenttype == 'application/pgp-signature':
if self._skipsign:
return
encoding = u'ascii'
if isinstance(data, str):
data = unicode(data, encoding)
......@@ -178,8 +180,6 @@ class MBOXImporter(object):
if name or main != 'text' and contenttype != 'application/pgp-signature':
# suppose if we have a name, this is an attachement else this is a
# part/alternative
if not name and main != 'text':
print 'duh', main, sub
name = name or u'no name'
if isinstance(data, unicode):
data = data.encode('utf8')
......
......@@ -19,13 +19,13 @@ CRM : http://www.pimentech.fr/solutions/crm
--
Alexandre Fayolle
''')
self.assertTextEquals(parsedmsg.actual_content, '''Des gens qui se sont mis sur le secteur erp avec du zope, du php, de postgresql et du debian : pimentech.
self.assertMultiLineEqual(parsedmsg.actual_content, '''Des gens qui se sont mis sur le secteur erp avec du zope, du php, de postgresql et du debian : pimentech.
jpl/crm/compta/paie intégré : http://www.pimentech.fr/solutions/pimenstud
gestion/compta : http://www.pimentech.fr/solutions/pimengest
travail collaboratif : http://www.pimentech.fr/solutions/notesgroup
CRM : http://www.pimentech.fr/solutions/crm''')
self.assertTextEquals(parsedmsg.cited_content, '')
self.assertMultiLineEqual(parsedmsg.cited_content, '')
def test_remove_cites(self):
......@@ -46,8 +46,8 @@ Formations Python, Zope, Plone, Debian: http://www.logilab.fr/formations
Développement logiciel sur mesure: http://www.logilab.fr/services
Python et calcul scientifique: http://www.logilab.fr/science
''')
self.assertTextEquals(parsedmsg.actual_content, '''leur solution CRM est même basé sur Zope...''')
self.assertTextEquals(parsedmsg.cited_content, '''On Tue, Jan 08, 2008 at 10:08:46AM +0100, Alexandre Fayolle wrote:
self.assertMultiLineEqual(parsedmsg.actual_content, '''leur solution CRM est même basé sur Zope...''')
self.assertMultiLineEqual(parsedmsg.cited_content, '''On Tue, Jan 08, 2008 at 10:08:46AM +0100, Alexandre Fayolle wrote:
Des gens qui se sont mis sur le secteur erp avec du zope, du php, de postgresql et du debian : pimentech.
jpl/crm/compta/paie intégré : http://www.pimentech.fr/solutions/pimenstud
gestion/compta : http://www.pimentech.fr/solutions/pimengest
......@@ -88,14 +88,14 @@ Python-Projects mailing list
Python-Projects@lists.logilab.org
http://lists.logilab.org/mailman/listinfo/python-projects
''')
self.assertTextEquals(parsedmsg.actual_content, '''Hi Marteen,
self.assertMultiLineEqual(parsedmsg.actual_content, '''Hi Marteen,
did you actually execute that code ?
_______________________________________________
Python-Projects mailing list
Python-Projects@lists.logilab.org
http://lists.logilab.org/mailman/listinfo/python-projects''')
self.assertTextEquals(parsedmsg.cited_content, '''On Wed, Jan 23, 2008 at 06:48:22PM +0100, Maarten ter Huurne wrote:
self.assertMultiLineEqual(parsedmsg.cited_content, '''On Wed, Jan 23, 2008 at 06:48:22PM +0100, Maarten ter Huurne wrote:
I wrote on 2008-01-23 06:27:07 PM:
[Lotus Notes ate my whitespace, here is the proper code layout, I hope]
===
......
......@@ -57,9 +57,9 @@ class ChangeStateHooksTC(CubicWebTC):
{'subject': subject, 'headers': self.msg})[0][0]
self.commit()
userstate = self.execute('Any SN WHERE X in_state S, S name SN, X eid %(x)s',
{'x': u.eid}, 'x')[0][0]
self.assertEquals(userstate, 'deactivated')
self.assertEquals(u.cw_adapt_to('IWorkflowable').latest_trinfo().creator.login, 'admin')
{'x': u.eid})[0][0]
self.assertEqual(userstate, 'deactivated')
self.assertEqual(u.cw_adapt_to('IWorkflowable').latest_trinfo().creator.login, 'admin')
def test_email_change_state_trinfo_owner(self):
self.execute('SET U use_email E WHERE U login "anon"')
......@@ -72,9 +72,9 @@ class ChangeStateHooksTC(CubicWebTC):
{'subject': subject, 'headers': self.msg})[0][0]
self.commit()
userstate = self.execute('Any SN WHERE X in_state S, S name SN, X eid %(x)s',
{'x': u.eid}, 'x')[0][0]
self.assertEquals(userstate, 'deactivated')
self.assertEquals(u.cw_adapt_to('IWorkflowable').latest_trinfo().creator.login, 'anon')
{'x': u.eid})[0][0]
self.assertEqual(userstate, 'deactivated')
self.assertEqual(u.cw_adapt_to('IWorkflowable').latest_trinfo().creator.login, 'anon')
def test_email_change_state_wrong_eid(self):
ueid = self.execute('INSERT CWUser X: X login "toto", X upassword "sosafe", X in_group G '
......@@ -86,8 +86,8 @@ class ChangeStateHooksTC(CubicWebTC):
{'subject': subject, 'headers': self.msg})[0][0]
self.commit()
userstate = self.execute('Any SN WHERE X in_state S, S name SN, X eid %(x)s',
{'x': ueid}, 'x')[0][0]
self.assertEquals(userstate, 'activated')
{'x': ueid})[0][0]
self.assertEqual(userstate, 'activated')
def test_email_change_state_unexistant_eid(self):
ueid = self.execute('INSERT CWUser X: X login "toto", X upassword "sosafe", X in_group G '
......@@ -99,8 +99,8 @@ class ChangeStateHooksTC(CubicWebTC):
{'subject': subject, 'headers': self.msg})[0][0]
self.commit()
userstate = self.execute('Any SN WHERE X in_state S, S name SN, X eid %(x)s',
{'x': ueid}, 'x')[0][0]
self.assertEquals(userstate, 'activated')
{'x': ueid})[0][0]
self.assertEqual(userstate, 'activated')
def test_email_change_state_unexistant_transition(self):
ueid = self.execute('INSERT CWUser X: X login "toto", X upassword "sosafe", X in_group G '
......@@ -112,8 +112,8 @@ class ChangeStateHooksTC(CubicWebTC):
{'subject': subject, 'headers': self.msg})[0][0]
self.commit()
userstate = self.execute('Any SN WHERE X in_state S, S name SN, X eid %(x)s',
{'x': ueid}, 'x')[0][0]
self.assertEquals(userstate, 'activated')
{'x': ueid})[0][0]
self.assertEqual(userstate, 'activated')
......
......@@ -14,52 +14,52 @@ class MBOXImporterTC(CubicWebTC):
def test_all(self):
mi = MBOXImporter(self.cnx)
mi.import_mbox_stream(open('data/mbox'))
self.assertEquals(sorted([(x, len(y)) for x, y in mi.created.items()]),
self.assertEqual(sorted([(x, len(y)) for x, y in mi.created.items()]),
[('email', 2), ('emailaddress', 4),
('emailpart', 5), ('emailthread', 2), ('file', 2)])
self.assertEquals(mi.skipped, [])
self.assertEqual(mi.skipped, [])
rset = self.execute('Any X ORDERBY S WHERE X is Email, X subject S')
self.assertEquals(len(rset), 2)
self.assertEqual(len(rset), 2)
email = rset.get_entity(0, 0)
self.assertEquals(email.subject, 'Re: [Python-projects] Pylint: Disable-msg for a block or statement?')
self.assertEquals(email.sender[0].address, 'pink@odahoda.de')
self.assertEquals(email.sender[0].alias, 'Benjamin Niemann')
self.assertEquals([r.address for r in email.recipients], ['python-projects@logilab.org'])
self.assertEquals([r.address for r in email.cc], [])
self.assertEquals(email.in_thread[0].title, '[Python-projects] Pylint: Disable-msg for a block or statement?')
self.assertEquals(sorted([(f.data_name, f.data_format) for f in email.attachment]),
self.assertEqual(email.subject, 'Re: [Python-projects] Pylint: Disable-msg for a block or statement?')
self.assertEqual(email.sender[0].address, 'pink@odahoda.de')
self.assertEqual(email.sender[0].alias, 'Benjamin Niemann')
self.assertEqual([r.address for r in email.recipients], ['python-projects@logilab.org'])
self.assertEqual([r.address for r in email.cc], [])
self.assertEqual(email.in_thread[0].title, '[Python-projects] Pylint: Disable-msg for a block or statement?')
self.assertEqual(sorted([(f.data_name, f.data_format) for f in email.attachment]),
[(u'astng.patch', u'text/x-diff'), (u'pylint.patch', u'text/x-diff')])
assert not self.vreg.schema['parts'].inlined
self.assertEquals(len(self.execute('Any P WHERE E parts P, E eid %s'%email.eid)), 2)
self.assertEquals(len(email.parts), 2)
self.assertEqual(len(self.execute('Any P WHERE E parts P, E eid %s'%email.eid)), 2)
self.assertEqual(len(email.parts), 2)
part1, part2 = email.parts_in_order()
self.assertEquals(part1.content_format,'text/plain')
self.assertEquals(part2.content_format,'text/plain')
self.assertEquals(part2.content, '''_______________________________________________
self.assertEqual(part1.content_format,'text/plain')
self.assertEqual(part2.content_format,'text/plain')
self.assertEqual(part2.content, '''_______________________________________________
Python-Projects mailing list
Python-Projects@lists.logilab.org
http://lists.logilab.org/mailman/listinfo/python-projects''')
email = rset.get_entity(1, 0)
self.assertEquals(email.subject, '[Python-projects] pylint: False positive about field initialisation')
self.assertEquals(email.sender[0].address, 'maarten.ter.huurne@philips.com')
self.assertEquals(email.sender[0].alias, 'Maarten ter Huurne')
self.assertEquals([r.address for r in email.recipients], ['python-projects@lists.logilab.org'])
self.assertEquals([r.address for r in email.cc], [])
self.assertEquals(email.in_thread[0].title, '[Python-projects] pylint: False positive about field initialisation')
self.assertEquals([(f.data_name, f.data_format) for f in email.attachment], [])
self.assertEquals(len(email.parts), 3)
self.assertEquals(sorted([r.content_format for r in email.parts]), [u'text/html', u'text/plain', u'text/plain'])
self.assertEqual(email.subject, '[Python-projects] pylint: False positive about field initialisation')
self.assertEqual(email.sender[0].address, 'maarten.ter.huurne@philips.com')
self.assertEqual(email.sender[0].alias, 'Maarten ter Huurne')
self.assertEqual([r.address for r in email.recipients], ['python-projects@lists.logilab.org'])
self.assertEqual([r.address for r in email.cc], [])
self.assertEqual(email.in_thread[0].title, '[Python-projects] pylint: False positive about field initialisation')
self.assertEqual([(f.data_name, f.data_format) for f in email.attachment], [])
self.assertEqual(len(email.parts), 3)
self.assertEqual(sorted([r.content_format for r in email.parts]), [u'text/html', u'text/plain', u'text/plain'])
part1, part2 = email.parts_in_order()
self.assertEquals(part1.content_format,'text/html')
self.assertEquals(part2.content_format,'text/plain')
self.assertEquals(part2.content, '''_______________________________________________
self.assertEqual(part1.content_format,'text/html')
self.assertEqual(part2.content_format,'text/plain')
self.assertEqual(part2.content, '''_______________________________________________
Python-Projects mailing list
Python-Projects@lists.logilab.org
http://lists.logilab.org/mailman/listinfo/python-projects''')
part1, part2 = email.parts_in_order('text/plain')
self.assertEquals(part1.content_format,'text/plain')
self.assertEquals(part2.content_format,'text/plain')
self.assertEqual(part1.content_format,'text/plain')
self.assertEqual(part2.content_format,'text/plain')
NOSUBJECT = """
......@@ -177,38 +177,38 @@ http://lists.logilab.org/mailman/listinfo/python-projects
mi = MBOXImporter(self.cnx)
mi.import_mbox_stream(StringIO(self.NOSUBJECT))
rset = self.execute('Any X ORDERBY S WHERE X is Email, X subject S')
self.assertEquals(len(rset), 1)
self.assertEqual(len(rset), 1)
email = rset.get_entity(0, 0)
self.assertEquals(email.subject, '(no subject)')
self.assertEquals(email.references(), set(('<xxx@blabla>',)))
self.assertEqual(email.subject, '(no subject)')
self.assertEqual(email.references(), set(('<xxx@blabla>',)))
def test_double_import(self):
mi = MBOXImporter(self.cnx)
mi.import_mbox_stream(StringIO(self.NOSUBJECT))
mi.import_mbox_stream(StringIO(self.NOSUBJECT))
rset = self.execute('Any X ORDERBY S WHERE X is Email, X subject S')
self.assertEquals(len(rset), 1)
self.assertEqual(len(rset), 1)
def test_address_detection(self):
# test both case normalization and canonicalization of email address
eid1 = self.execute('INSERT EmailAddress X: X address "maarten.ter.huurne@philips.com"')[0][0]
eid2 = self.execute('INSERT EmailAddress X: X address "maarten@philips.com"')[0][0]
self.execute('SET X prefered_form Y WHERE X eid %s, Y eid %s' % (eid1, eid2))
#self.assertEquals(env.vreg.schema['identical_to'].symetric, True)
#self.assertEqual(env.vreg.schema['identical_to'].symetric, True)
#ea1 = cursor.execute('Any X WHERE X eid %s' % eid2).get_entity(0, None)
#self.assertEquals(ea1.canonical, True)
#self.assertEqual(ea1.canonical, True)
#testrset = cursor.execute('Any X WHERE X canonical FALSE')
#self.assertEquals(testrset[0][0], eid1)
#self.assertEqual(testrset[0][0], eid1)
#testrset = cursor.execute('Any X WHERE X canonical TRUE')
#self.assertEquals(testrset[0][0], eid2)
#self.assertEqual(testrset[0][0], eid2)
#testrset = cursor.execute('Any X WHERE X identical_to Y, X canonical TRUE, Y eid %(y)s', {'y': eid1})
#self.assertEquals(testrset[0][0], eid2)
#self.assertEqual(testrset[0][0], eid2)
mi = MBOXImporter(self.cnx)
mi.import_mbox_stream(StringIO(self.NOSUBJECT))
rset = self.execute('Any X ORDERBY S WHERE X is Email, X subject S')
self.assertEquals(len(rset), 1)
self.assertEqual(len(rset), 1)
email = rset.get_entity(0, 0)
self.assertEquals(email.sender[0].address, 'maarten@philips.com')
self.assertEqual(email.sender[0].address, 'maarten@philips.com')
if __name__ == '__main__':
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment