delete old values when set new multiple attribute values (#32025)
This commit is contained in:
parent
e3bf9767ca
commit
8879c1d83b
|
@ -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)
|
||||
|
|
|
@ -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)]
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue