diff --git a/seahub/api2/views.py b/seahub/api2/views.py index 4c241fea37..3ceb94498f 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -47,7 +47,8 @@ from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \ from seahub.base.accounts import User from seahub.base.models import UserStarredFiles, DeviceToken from seahub.base.templatetags.seahub_tags import email2nickname, \ - translate_seahub_time, translate_commit_desc_escape + translate_seahub_time, translate_commit_desc_escape, \ + email2contact_email from seahub.group.views import remove_group_common, \ rename_group_with_new_name, is_group_staff from seahub.group.utils import BadGroupNameError, ConflictGroupNameError, \ @@ -1491,6 +1492,9 @@ def get_dir_entrys_by_id(request, repo, path, dir_id, request_type=None): else: entry["locked_by_me"] = False + entry['modifier_email'] = dirent.modifier + entry['modifier_contact_email'] = email2contact_email(dirent.modifier) + entry['modifier_name'] = email2nickname(dirent.modifier) entry["type"] = dtype entry["name"] = dirent.obj_name entry["id"] = dirent.obj_id diff --git a/seahub/base/templatetags/seahub_tags.py b/seahub/base/templatetags/seahub_tags.py index 2b9421061f..9400da86f3 100644 --- a/seahub/base/templatetags/seahub_tags.py +++ b/seahub/base/templatetags/seahub_tags.py @@ -18,7 +18,8 @@ from django.utils.html import escape from seahub.base.accounts import User from seahub.profile.models import Profile from seahub.profile.settings import NICKNAME_CACHE_TIMEOUT, NICKNAME_CACHE_PREFIX, \ - EMAIL_ID_CACHE_TIMEOUT, EMAIL_ID_CACHE_PREFIX + EMAIL_ID_CACHE_TIMEOUT, EMAIL_ID_CACHE_PREFIX, CONTACT_CACHE_TIMEOUT, \ + CONTACT_CACHE_PREFIX from seahub.cconvert import CConvert from seahub.po import TRANSLATION_MAP from seahub.shortcuts import get_first_object_or_none @@ -371,7 +372,14 @@ def email2contact_email(value): if not value: return '' - return Profile.objects.get_contact_email_by_user(value) + key = normalize_cache_key(value, CONTACT_CACHE_PREFIX) + contact_email = cache.get(key) + if contact_email and contact_email.strip(): + return contact_email + + contact_email = Profile.objects.get_contact_email_by_user(value) + cache.set(key, contact_email, CONTACT_CACHE_TIMEOUT) + return contact_email @register.filter(name='email2id') def email2id(value): diff --git a/seahub/profile/models.py b/seahub/profile/models.py index 41234edb32..4ccd07ecfc 100644 --- a/seahub/profile/models.py +++ b/seahub/profile/models.py @@ -28,6 +28,19 @@ class ProfileManager(models.Manager): profile.save(using=self._db) return profile + def update_contact_email(self, username, contact_email): + """ + update contact_email of profile + """ + try: + profile = self.get(user=username) + profile.contact_email = contact_email + except Profile.DoesNotExist: + logger.warn('%s profile does not exists' % username) + return None + profile.save(using=self._db) + return profile + def get_profile_by_user(self, username): """Get a user's profile. """ @@ -143,6 +156,9 @@ def clean_email_id_cache(sender, **kwargs): key = normalize_cache_key(user.email, EMAIL_ID_CACHE_PREFIX) cache.set(key, user.id, EMAIL_ID_CACHE_TIMEOUT) -@receiver(post_save, sender=Profile, dispatch_uid="update_nickname_cache") -def update_nickname_cache(sender, instance, **kwargs): +@receiver(post_save, sender=Profile, dispatch_uid="update_profile_cache") +def update_profile_cache(sender, instance, **kwargs): + """ + Set profile data to cache when profile data change. + """ refresh_cache(instance.user) diff --git a/seahub/profile/settings.py b/seahub/profile/settings.py index 6c2dc1d899..dbe3c5815f 100644 --- a/seahub/profile/settings.py +++ b/seahub/profile/settings.py @@ -6,3 +6,6 @@ NICKNAME_CACHE_PREFIX = getattr(settings, 'NICKNAME_CACHE_PREFIX', 'NICKNAME_') EMAIL_ID_CACHE_TIMEOUT = getattr(settings, 'EMAIL_ID_CACHE_TIMEOUT', 14 * 24 * 60 * 60) EMAIL_ID_CACHE_PREFIX = getattr(settings, 'EMAIL_ID_CACHE_PREFIX', 'EMAIL_ID_') + +CONTACT_CACHE_TIMEOUT = getattr(settings, 'CONTACT_CACHE_TIMEOUT', 24 * 60 * 60) +CONTACT_CACHE_PREFIX = getattr(settings, 'CONTACT_CACHE_PREFIX', 'CONTACT_') diff --git a/seahub/profile/utils.py b/seahub/profile/utils.py index 4cff6e079e..6979755cc0 100644 --- a/seahub/profile/utils.py +++ b/seahub/profile/utils.py @@ -2,7 +2,8 @@ from django.core.cache import cache from models import Profile -from settings import NICKNAME_CACHE_PREFIX, NICKNAME_CACHE_TIMEOUT +from settings import NICKNAME_CACHE_PREFIX, NICKNAME_CACHE_TIMEOUT, \ + CONTACT_CACHE_TIMEOUT, CONTACT_CACHE_PREFIX from seahub.shortcuts import get_first_object_or_none from seahub.utils import normalize_cache_key @@ -12,7 +13,10 @@ def refresh_cache(username): """ profile = get_first_object_or_none(Profile.objects.filter(user=username)) nickname = profile.nickname if profile else username.split('@')[0] + contactemail = profile.contact_email if profile else '' key = normalize_cache_key(username, NICKNAME_CACHE_PREFIX) cache.set(key, nickname, NICKNAME_CACHE_TIMEOUT) + contact_key = normalize_cache_key(username, CONTACT_CACHE_PREFIX) + cache.set(contact_key, contactemail, CONTACT_CACHE_TIMEOUT) diff --git a/tests/api/test_dir.py b/tests/api/test_dir.py index 771266326b..929148ec08 100644 --- a/tests/api/test_dir.py +++ b/tests/api/test_dir.py @@ -1,9 +1,14 @@ import json import os +import time from django.core.urlresolvers import reverse +from django.core.cache import cache from seahub.test_utils import BaseTestCase +from seahub.profile.models import Profile +from seahub.base.templatetags.seahub_tags import email2nickname, email2contact_email +from seahub.utils import normalize_cache_key class DirTest(BaseTestCase): def setUp(self): @@ -35,3 +40,27 @@ class DirTest(BaseTestCase): }) self.assertEqual(400, resp.status_code) + + def test_get_dir_file_modifier(self): + # upload the file , then test whether can get modifier + self.login_as(self.user) + self.text = self.create_file(repo_id=self.repo.id, + parent_dir='/', + filename='test.az', + username=self.user.username) + + resp = self.client.get(self.endpoint) + self.assertEqual(200, resp.status_code) + json_resp = json.loads(resp.content) + assert json_resp[1]['type'] == 'file' + assert json_resp[1]['modifier_email'] == self.user.username + assert json_resp[1]['modifier_name'] == \ + email2nickname(self.user.username) + assert json_resp[1]['modifier_contact_email'] == \ + email2contact_email(self.user.username) + + p = Profile.objects.add_or_update(self.user.username, + 'test') + p = Profile.objects.update_contact_email(self.user.username, self.user.username) + assert cache.get(normalize_cache_key(self.user.username, 'CONTACT_')) == \ + self.user.username