delete old values when set new multiple attribute values (#32025)

This commit is contained in:
Paul Marillonnet 2019-04-05 13:10:17 +02:00
parent e3bf9767ca
commit 8879c1d83b
3 changed files with 37 additions and 13 deletions

View File

@ -18,7 +18,7 @@ import time
import uuid
from django.utils.http import urlquote
from django.conf import settings
from django.db import models
from django.db import models, transaction
from django.db.models.query import Q
from django.utils import six
from django.utils.translation import ugettext_lazy as _
@ -249,19 +249,30 @@ class Attribute(models.Model):
assert isinstance(value, (list, set, tuple))
values = value
avs = []
for value in values:
content = serialize(value)
av, created = AttributeValue.objects.get_or_create(
content_list = []
with transaction.atomic():
for value in values:
content = serialize(value)
av, created = AttributeValue.objects.get_or_create(
content_type=ContentType.objects.get_for_model(owner),
object_id=owner.pk,
attribute=self,
multiple=True,
content=content,
defaults={'verified': verified})
if not created:
av.verified = verified
av.save()
avs.append(av)
content_list.append(content)
AttributeValue.objects.filter(
attribute=self,
content_type=ContentType.objects.get_for_model(owner),
object_id=owner.pk,
attribute=self,
multiple=True,
content=content,
defaults={'verified': verified})
if not created:
av.verified = verified
av.save()
avs.append(av)
multiple=True
).exclude(content__in=content_list).delete()
return avs
else:
content = serialize(value)

View File

@ -463,3 +463,16 @@ def test_profile_image(db, app, admin, mailoutbox, media):
response = app.get('/accounts/edit/')
form = response.form
assert form['edit-profile-cityscape_image'].attrs['accept'] == 'image/*'
def test_multiple_attribute_setter(db, app, simple_user):
nicks = Attribute.objects.create(name='nicknames', label='Nicknames', kind='string',
required=False, multiple=True, user_visible=True, user_editable=True)
simple_user.attributes.nicknames = ['Roger', 'Tony', 'Robie']
simple_user.save()
assert 'Tony' in [atv.content for atv in simple_user.attribute_values.filter(attribute=nicks)]
simple_user.attributes.nicknames = ['Roger', 'Timmy', 'Robie']
simple_user.save()
assert not 'Tony' in [atv.content for atv in simple_user.attribute_values.filter(attribute=nicks)]

View File

@ -57,7 +57,7 @@ def test_attribute_value_uniqueness(migrations, transactional_db, simple_user, c
connection.close()
map_threads(f, range(concurrency))
map_threads(f, range(concurrency))
assert AttributeValue.objects.filter(attribute=multiple_at).count() == concurrency
assert AttributeValue.objects.filter(attribute=multiple_at).count() == 1
def f(i):
simple_user.attributes.single = str(i)