Projet

Général

Profil

0003-delete-old-values-when-set-new-multiple-attribute-va.patch

Paul Marillonnet, 05 avril 2019 15:54

Télécharger (4,4 ko)

Voir les différences:

Subject: [PATCH 3/3] delete old values when set new multiple attribute values
 (#32025)

 src/authentic2/models.py      | 40 +++++++++++++++++++++++------------
 tests/test_attribute_kinds.py | 13 ++++++++++++
 tests/test_concurrency.py     |  2 +-
 3 files changed, 40 insertions(+), 15 deletions(-)
src/authentic2/models.py
2 2
import uuid
3 3
from django.utils.http import urlquote
4 4
from django.conf import settings
5
from django.db import models
5
from django.db import models, transaction
6 6
from django.db.models.query import Q
7 7
from django.utils import six
8 8
from django.utils.translation import ugettext_lazy as _
......
214 214
            assert isinstance(value, (list, set, tuple))
215 215
            values = value
216 216
            avs = []
217
            for value in values:
218
                content = serialize(value)
219
                av, created = AttributeValue.objects.get_or_create(
220
                        content_type=ContentType.objects.get_for_model(owner),
221
                        object_id=owner.pk,
222
                        attribute=self,
223
                        multiple=True,
224
                        content=content,
225
                        defaults={'verified': verified})
226
                if not created:
227
                    av.verified = verified
228
                    av.save()
229
                avs.append(av)
217
            content_list = []
218

  
219
            with transaction.atomic():
220
                for value in values:
221
                    content = serialize(value)
222
                    av, created = AttributeValue.objects.get_or_create(
223
                            content_type=ContentType.objects.get_for_model(owner),
224
                            object_id=owner.pk,
225
                            attribute=self,
226
                            multiple=True,
227
                            content=content,
228
                            defaults={'verified': verified})
229
                    if not created:
230
                        av.verified = verified
231
                        av.save()
232
                    avs.append(av)
233
                    content_list.append(content)
234

  
235
                AttributeValue.objects.filter(
236
                    attribute=self,
237
                    content_type=ContentType.objects.get_for_model(owner),
238
                    object_id=owner.pk,
239
                    multiple=True
240
                ).exclude(content__in=content_list).delete()
241

  
230 242
            return avs
231 243
        else:
232 244
            content = serialize(value)
tests/test_attribute_kinds.py
447 447
    response = app.get('/accounts/edit/')
448 448
    form = response.form
449 449
    assert form['edit-profile-cityscape_image'].attrs['accept'] == 'image/*'
450

  
451

  
452
def test_multiple_attribute_setter(db, app, simple_user):
453
    nicks = Attribute.objects.create(name='nicknames', label='Nicknames', kind='string',
454
                             required=False, multiple=True, user_visible=True, user_editable=True)
455

  
456
    simple_user.attributes.nicknames = ['Roger', 'Tony', 'Robie']
457
    simple_user.save()
458
    assert 'Tony' in [atv.content for atv in simple_user.attribute_values.filter(attribute=nicks)]
459

  
460
    simple_user.attributes.nicknames = ['Roger', 'Timmy', 'Robie']
461
    simple_user.save()
462
    assert not 'Tony' in [atv.content for atv in simple_user.attribute_values.filter(attribute=nicks)]
tests/test_concurrency.py
41 41
        connection.close()
42 42
    map_threads(f, range(concurrency))
43 43
    map_threads(f, range(concurrency))
44
    assert AttributeValue.objects.filter(attribute=multiple_at).count() == concurrency
44
    assert AttributeValue.objects.filter(attribute=multiple_at).count() == 1
45 45

  
46 46
    def f(i):
47 47
        simple_user.attributes.single = str(i)
48
-