summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAurélien Bompard <aurelien@bompard.org>2013-08-01 12:16:39 +0200
committerAurélien Bompard <aurelien@bompard.org>2013-08-01 12:19:58 +0000
commitea538b0cba128ec298de667e7dd5646312415909 (patch)
treebcdc152e518e16f1dc58385a8ae831499c85cd28
parentae2545fe6f6859156e850f456d72419156ce918b (diff)
downloadkittystore-ea538b0cba128ec298de667e7dd5646312415909.tar.gz
kittystore-ea538b0cba128ec298de667e7dd5646312415909.tar.xz
kittystore-ea538b0cba128ec298de667e7dd5646312415909.zip
Use the user_id as key in HK to avoid exposing the email address
-rw-r--r--kittystore/scripts.py11
-rw-r--r--kittystore/storm/model.py2
-rw-r--r--kittystore/storm/store.py60
3 files changed, 47 insertions, 26 deletions
diff --git a/kittystore/scripts.py b/kittystore/scripts.py
index e12a174..4ae2690 100644
--- a/kittystore/scripts.py
+++ b/kittystore/scripts.py
@@ -82,6 +82,17 @@ def updatedb():
))[0][0]
print "Done, the current schema version is %d." % version
+ ## More complex post-update actions:
+
+ # Fill in the user_id from Mailman
+ from kittystore.storm.model import UserAddress, Email
+ if store.db.find(UserAddress).count() == 0:
+ for address in store.db.find(Email.sender_email
+ ).config(distinct=True):
+ store._store_mailman_user(address)
+ store.commit()
+
+
#
# Mailman 2 archives downloader
diff --git a/kittystore/storm/model.py b/kittystore/storm/model.py
index f7bb82e..c827640 100644
--- a/kittystore/storm/model.py
+++ b/kittystore/storm/model.py
@@ -89,6 +89,8 @@ class Email(Storm):
("EmailFull.list_name", "EmailFull.message_id"))
full = Proxy(full_email, "EmailFull.full")
mlist = Reference(list_name, "List.name")
+ _user_address = Reference(sender_email, "UserAddress.address")
+ user_id = Proxy(_user_address, "UserAddress.user_id")
def __init__(self, list_name, message_id):
self.list_name = unicode(list_name)
diff --git a/kittystore/storm/store.py b/kittystore/storm/store.py
index 172242a..c41292a 100644
--- a/kittystore/storm/store.py
+++ b/kittystore/storm/store.py
@@ -142,22 +142,8 @@ class StormStore(object):
# warning: scrubbing modifies the msg in-place
email.content, attachments = scrubber.scrub()
- # get the Mailman user
- try:
- mm_client = mailmanclient.Client('%s/3.0' %
- self.settings.MAILMAN_REST_SERVER,
- self.settings.MAILMAN_API_USER,
- self.settings.MAILMAN_API_PASS)
- mm_user = mm_client.get_user(email.sender_email)
- except (HTTPError, mailmanclient.MailmanConnectionError), e:
- if self.debug:
- print "Can't get the user from Mailman: %s" % e
- else:
- user_already_there = self.db.find(UserAddress,
- address=email.sender_email).count()
- if not user_already_there:
- user = UserAddress(mm_user.user_id, email.sender_email)
- self.db.add(user)
+ # store the Mailman user
+ self._store_mailman_user(email.sender_email)
#category = 'Question' # TODO: enum + i18n ?
#if ('agenda' in message.get('Subject', '').lower() or
@@ -186,6 +172,24 @@ class StormStore(object):
self.search_index.add(email)
return email.message_id_hash
+ def _store_mailman_user(self, address):
+ try:
+ mm_client = mailmanclient.Client('%s/3.0' %
+ self.settings.MAILMAN_REST_SERVER,
+ self.settings.MAILMAN_API_USER,
+ self.settings.MAILMAN_API_PASS)
+ mm_user = mm_client.get_user(address)
+ except (HTTPError, mailmanclient.MailmanConnectionError), e:
+ if self.debug:
+ print "Can't get the user from Mailman: %s" % e
+ else:
+ user_already_there = self.db.find(UserAddress,
+ address=address).count()
+ if not user_already_there:
+ user = UserAddress(mm_user.user_id, address)
+ self.db.add(user)
+
+
def attach_to_thread(self, email, thread):
"""Attach an email to an existing thread"""
if email.date <= thread.starting_email.date:
@@ -564,28 +568,32 @@ class StormStore(object):
return list(self.db.find(Category.name).order_by(Category.name))
- def get_first_post(self, list_name, email):
+ def get_first_post(self, list_name, user_id):
""" Returns a user's first post on a list """
result = self.db.find(Email, And(
Email.list_name == unicode(list_name),
- Email.sender_email == unicode(email),
+ Email.sender_email == UserAddress.address,
+ UserAddress.user_id == unicode(user_id),
)).order_by(Email.archived_date
).config(limit=1).one()
return result
- def get_sender_name(self, email):
- """ Returns a user's fullname when given his email """
- result = self.db.find(Email.sender_name,
- Email.sender_email == unicode(email),
- ).config(distinct=True, limit=1)[0]
+ def get_sender_name(self, user_id):
+ """ Returns a user's fullname when given his user_id """
+ result = self.db.find(Email.sender_name, And(
+ Email.sender_email == UserAddress.address,
+ UserAddress.user_id == unicode(user_id),
+ )).config(limit=1).one()
return result
- def get_message_hashes_by_sender(self, email, list_name=None):
+ def get_message_hashes_by_user_id(self, user_id, list_name=None):
""" Returns a user's email hashes """
if list_name is None:
- clause = (Email.sender_email == unicode(email))
+ clause = And(Email.sender_email == UserAddress.address,
+ UserAddress.user_id == unicode(user_id))
else:
- clause = And(Email.sender_email == unicode(email),
+ clause = And(Email.sender_email == UserAddress.address,
+ UserAddress.user_id == unicode(user_id),
Email.list_name == unicode(list_name))
result = self.db.find(Email.message_id_hash, clause)
return list(result)