Issue 3147: Remove user.photo file on anonimize

remotes/origin/logger
Alejandro Alonso 2015-09-16 08:46:36 +02:00 committed by David Barragán Merino
parent 52ce55f3e9
commit 69f5b609fb
3 changed files with 72 additions and 1 deletions

View File

@ -233,6 +233,7 @@ class UsersViewSet(ModelCrudViewSet):
except Exception: except Exception:
raise exc.WrongArguments(_("Invalid image format")) raise exc.WrongArguments(_("Invalid image format"))
request.user.delete_photo()
request.user.photo = avatar request.user.photo = avatar
request.user.save(update_fields=["photo"]) request.user.save(update_fields=["photo"])
user_data = self.admin_serializer_class(request.user).data user_data = self.admin_serializer_class(request.user).data
@ -245,7 +246,7 @@ class UsersViewSet(ModelCrudViewSet):
Remove the avatar of current logged user. Remove the avatar of current logged user.
""" """
self.check_permissions(request, "remove_avatar", None) self.check_permissions(request, "remove_avatar", None)
request.user.photo = None request.user.delete_photo()
request.user.save(update_fields=["photo"]) request.user.save(update_fields=["photo"])
user_data = self.admin_serializer_class(request.user).data user_data = self.admin_serializer_class(request.user).data
return response.Ok(user_data) return response.Ok(user_data)

View File

@ -40,6 +40,8 @@ from taiga.base.utils.slug import slugify_uniquely
from taiga.base.utils.iterators import split_by_n from taiga.base.utils.iterators import split_by_n
from taiga.permissions.permissions import MEMBERS_PERMISSIONS from taiga.permissions.permissions import MEMBERS_PERMISSIONS
from easy_thumbnails.files import get_thumbnailer
def generate_random_hex_color(): def generate_random_hex_color():
return "#{:06x}".format(random.randint(0,0xFFFFFF)) return "#{:06x}".format(random.randint(0,0xFFFFFF))
@ -174,9 +176,22 @@ class User(AbstractBaseUser, PermissionsMixin):
self.colorize_tags = True self.colorize_tags = True
self.token = None self.token = None
self.set_unusable_password() self.set_unusable_password()
self.delete_photo()
self.save() self.save()
self.auth_data.all().delete() self.auth_data.all().delete()
def delete_photo(self):
# Removing thumbnails
thumbnailer = get_thumbnailer(self.photo)
thumbnailer.delete_thumbnails()
# Removing original photo
if self.photo:
storage, path = self.photo.storage, self.photo.path
storage.delete(path)
self.photo = None
class Role(models.Model): class Role(models.Model):
name = models.CharField(max_length=200, null=False, blank=False, name = models.CharField(max_length=200, null=False, blank=False,

View File

@ -3,6 +3,7 @@ from tempfile import NamedTemporaryFile
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.files import File
from .. import factories as f from .. import factories as f
@ -12,6 +13,10 @@ from taiga.auth.tokens import get_token_for_user
from taiga.permissions.permissions import MEMBERS_PERMISSIONS, ANON_PERMISSIONS, USER_PERMISSIONS from taiga.permissions.permissions import MEMBERS_PERMISSIONS, ANON_PERMISSIONS, USER_PERMISSIONS
from taiga.users.services import get_favourites_list from taiga.users.services import get_favourites_list
from easy_thumbnails.files import generate_all_aliases, get_thumbnailer
import os
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
@ -193,6 +198,56 @@ def test_change_avatar(client):
assert response.status_code == 200 assert response.status_code == 200
def test_change_avatar_removes_the_old_one(client):
url = reverse('users-change-avatar')
user = f.UserFactory()
with NamedTemporaryFile(delete=False) as avatar:
avatar.write(DUMMY_BMP_DATA)
avatar.seek(0)
user.photo = File(avatar)
user.save()
generate_all_aliases(user.photo, include_global=True)
with NamedTemporaryFile(delete=False) as avatar:
thumbnailer = get_thumbnailer(user.photo)
original_photo_paths = [user.photo.path]
original_photo_paths += [th.path for th in thumbnailer.get_thumbnails()]
assert list(map(os.path.exists, original_photo_paths)) == [True, True, True, True]
client.login(user)
avatar.write(DUMMY_BMP_DATA)
avatar.seek(0)
post_data = {'avatar': avatar}
response = client.post(url, post_data)
assert response.status_code == 200
assert list(map(os.path.exists, original_photo_paths)) == [False, False, False, False]
def test_remove_avatar(client):
url = reverse('users-remove-avatar')
user = f.UserFactory()
with NamedTemporaryFile(delete=False) as avatar:
avatar.write(DUMMY_BMP_DATA)
avatar.seek(0)
user.photo = File(avatar)
user.save()
generate_all_aliases(user.photo, include_global=True)
thumbnailer = get_thumbnailer(user.photo)
original_photo_paths = [user.photo.path]
original_photo_paths += [th.path for th in thumbnailer.get_thumbnails()]
assert list(map(os.path.exists, original_photo_paths)) == [True, True, True, True]
client.login(user)
response = client.post(url)
assert response.status_code == 200
assert list(map(os.path.exists, original_photo_paths)) == [False, False, False, False]
def test_list_contacts_private_projects(client): def test_list_contacts_private_projects(client):
project = f.ProjectFactory.create() project = f.ProjectFactory.create()
user_1 = f.UserFactory.create() user_1 = f.UserFactory.create()