udata 10.7.1.dev36402__py2.py3-none-any.whl → 10.7.1.dev36429__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. udata/core/site/models.py +1 -5
  2. udata/core/tags/tasks.py +1 -1
  3. udata/mongo/queryset.py +34 -21
  4. udata/mongo/slug_fields.py +4 -4
  5. udata/static/chunks/{10.8ca60413647062717b1e.js → 10.471164b2a9fe15614797.js} +3 -3
  6. udata/static/chunks/{10.8ca60413647062717b1e.js.map → 10.471164b2a9fe15614797.js.map} +1 -1
  7. udata/static/chunks/{11.b6f741fcc366abfad9c4.js → 11.51d706fb9521c16976bc.js} +3 -3
  8. udata/static/chunks/{11.b6f741fcc366abfad9c4.js.map → 11.51d706fb9521c16976bc.js.map} +1 -1
  9. udata/static/chunks/{13.2d06442dd9a05d9777b5.js → 13.f29411b06be1883356a3.js} +2 -2
  10. udata/static/chunks/{13.2d06442dd9a05d9777b5.js.map → 13.f29411b06be1883356a3.js.map} +1 -1
  11. udata/static/chunks/{17.e8e4caaad5cb0cc0bacc.js → 17.3bd0340930d4a314ce9c.js} +2 -2
  12. udata/static/chunks/{17.e8e4caaad5cb0cc0bacc.js.map → 17.3bd0340930d4a314ce9c.js.map} +1 -1
  13. udata/static/chunks/{19.f03a102365af4315f9db.js → 19.8da42e8359d72afc2618.js} +3 -3
  14. udata/static/chunks/{19.f03a102365af4315f9db.js.map → 19.8da42e8359d72afc2618.js.map} +1 -1
  15. udata/static/chunks/{8.778091d55cd8ea39af6b.js → 8.54e44b102164ae5e7a67.js} +2 -2
  16. udata/static/chunks/{8.778091d55cd8ea39af6b.js.map → 8.54e44b102164ae5e7a67.js.map} +1 -1
  17. udata/static/chunks/{9.033d7e190ca9e226a5d0.js → 9.07515e5187f475bce828.js} +3 -3
  18. udata/static/chunks/{9.033d7e190ca9e226a5d0.js.map → 9.07515e5187f475bce828.js.map} +1 -1
  19. udata/static/common.js +1 -1
  20. udata/static/common.js.map +1 -1
  21. udata/tests/api/test_contact_points.py +33 -0
  22. udata/tests/site/test_site_model.py +29 -1
  23. udata/tests/test_routing.py +19 -0
  24. {udata-10.7.1.dev36402.dist-info → udata-10.7.1.dev36429.dist-info}/METADATA +2 -1
  25. {udata-10.7.1.dev36402.dist-info → udata-10.7.1.dev36429.dist-info}/RECORD +29 -29
  26. {udata-10.7.1.dev36402.dist-info → udata-10.7.1.dev36429.dist-info}/LICENSE +0 -0
  27. {udata-10.7.1.dev36402.dist-info → udata-10.7.1.dev36429.dist-info}/WHEEL +0 -0
  28. {udata-10.7.1.dev36402.dist-info → udata-10.7.1.dev36429.dist-info}/entry_points.txt +0 -0
  29. {udata-10.7.1.dev36402.dist-info → udata-10.7.1.dev36429.dist-info}/top_level.txt +0 -0
udata/core/site/models.py CHANGED
@@ -213,15 +213,11 @@ def get_current_site():
213
213
  site_keywords = current_app.config.get("SITE_KEYWORDS", [])
214
214
  g.site, _ = Site.objects.get_or_create(
215
215
  id=site_id,
216
- defaults={
216
+ updates={
217
217
  "title": site_title,
218
218
  "keywords": site_keywords,
219
219
  },
220
220
  )
221
- if g.site.title != site_title:
222
- Site.objects(id=site_id).modify(set__title=site_title)
223
- if g.site.keywords != site_keywords:
224
- Site.objects(id=site_id).modify(set__keywords=site_keywords)
225
221
 
226
222
  return g.site
227
223
 
udata/core/tags/tasks.py CHANGED
@@ -38,6 +38,6 @@ def count_tags(self):
38
38
  collection = "{0}_tags".format(key)
39
39
  results = model.objects(tags__exists=True).map_reduce(map_tags, reduce_tags, collection)
40
40
  for result in results:
41
- tag, created = Tag.objects.get_or_create(name=result.key, auto_save=False)
41
+ tag, _ = Tag.objects.get_or_create(name=result.key)
42
42
  tag.counts[key] = int(result.value) if result.value else 0
43
43
  tag.save()
udata/mongo/queryset.py CHANGED
@@ -2,6 +2,7 @@ import logging
2
2
 
3
3
  from bson import DBRef, ObjectId
4
4
  from flask_mongoengine import BaseQuerySet
5
+ from mongoengine.signals import post_save
5
6
 
6
7
  from udata.utils import Paginable
7
8
 
@@ -46,29 +47,41 @@ class UDataQuerySet(BaseQuerySet):
46
47
  data = self.in_bulk(ids)
47
48
  return [data[id] for id in ids]
48
49
 
49
- def get_or_create(self, write_concern=None, auto_save=True, *q_objs, **query):
50
- """Retrieve unique object or create, if it doesn't exist.
51
-
52
- Returns a tuple of ``(object, created)``, where ``object`` is
53
- the retrieved or created object and ``created`` is a boolean
54
- specifying whether a new object was created.
55
-
56
- Taken back from:
50
+ def get_or_create(self, **query):
51
+ """
52
+ Atomically retrieve or create a document using findAndModify (modify in MongoEngine).
53
+ We allow to update the model with the `updates`. The raw kwargs are for the filtering and
54
+ the `updates` are only using to set values for the first creation or update the existing one.
57
55
 
58
- https://github.com/MongoEngine/mongoengine/
59
- pull/1029/files#diff-05c70acbd0634d6d05e4a6e3a9b7d66b
56
+ Returns:
57
+ tuple: (document, created)
60
58
  """
61
- defaults = query.pop("defaults", {})
62
- try:
63
- doc = self.get(*q_objs, **query)
64
- return doc, False
65
- except self._document.DoesNotExist:
66
- query.update(defaults)
67
- doc = self._document(**query)
68
-
69
- if auto_save:
70
- doc.save(write_concern=write_concern)
71
- return doc, True
59
+ updates = query.pop("updates", {})
60
+
61
+ # If we pass `new=True` we cannot know if the model
62
+ # was recently created or existed before.
63
+ # When passing `new=False` (the default), we get the previous
64
+ # value: `None` if it wasn't existing, the object if it was already
65
+ # existing.
66
+ # This way of doing force us to do a new request to fetch the document
67
+ # after the modify.
68
+ existing_doc_before_upsert = self.filter(
69
+ **query
70
+ ).modify(
71
+ upsert=True,
72
+ **query, # Require because `updates` can be empty and `modify` crash when no values are provided.
73
+ **updates,
74
+ )
75
+
76
+ # We may avoid this query if `existing_doc_before_upsert` is not `None`
77
+ # by updating the local document with the new values (but the database may
78
+ # have updates too? default values?).
79
+ document = self.get(**query)
80
+ created = existing_doc_before_upsert is None
81
+ if created:
82
+ post_save.send(document.__class__, document=document)
83
+
84
+ return document, created
72
85
 
73
86
  def generic_in(self, **kwargs):
74
87
  """Bypass buggy GenericReferenceField querying issue"""
@@ -199,13 +199,13 @@ def populate_slug(instance, field):
199
199
 
200
200
  if old_slug:
201
201
  # Create a redirect for previous slug
202
- slug_follower, created = SlugFollow.objects.get_or_create(
202
+ SlugFollow.objects.get_or_create(
203
203
  namespace=ns,
204
204
  old_slug=old_slug,
205
- auto_save=False,
205
+ updates={
206
+ "new_slug": slug,
207
+ },
206
208
  )
207
- slug_follower.new_slug = slug
208
- slug_follower.save()
209
209
 
210
210
  # Maintain previous redirects
211
211
  SlugFollow.objects(namespace=ns, new_slug=old_slug).update(new_slug=slug)