0003-delete-old-values-when-set-new-multiple-attribute-va.patch
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 |
- |