udata 10.7.1.dev36387__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.
- udata/core/site/models.py +1 -5
- udata/core/tags/tasks.py +1 -1
- udata/frontend/__init__.py +8 -0
- udata/mongo/queryset.py +34 -21
- udata/mongo/slug_fields.py +4 -4
- udata/static/chunks/{10.8ca60413647062717b1e.js → 10.471164b2a9fe15614797.js} +3 -3
- udata/static/chunks/{10.8ca60413647062717b1e.js.map → 10.471164b2a9fe15614797.js.map} +1 -1
- udata/static/chunks/{11.b6f741fcc366abfad9c4.js → 11.51d706fb9521c16976bc.js} +3 -3
- udata/static/chunks/{11.b6f741fcc366abfad9c4.js.map → 11.51d706fb9521c16976bc.js.map} +1 -1
- udata/static/chunks/{13.2d06442dd9a05d9777b5.js → 13.f29411b06be1883356a3.js} +2 -2
- udata/static/chunks/{13.2d06442dd9a05d9777b5.js.map → 13.f29411b06be1883356a3.js.map} +1 -1
- udata/static/chunks/{17.e8e4caaad5cb0cc0bacc.js → 17.3bd0340930d4a314ce9c.js} +2 -2
- udata/static/chunks/{17.e8e4caaad5cb0cc0bacc.js.map → 17.3bd0340930d4a314ce9c.js.map} +1 -1
- udata/static/chunks/{19.f03a102365af4315f9db.js → 19.8da42e8359d72afc2618.js} +3 -3
- udata/static/chunks/{19.f03a102365af4315f9db.js.map → 19.8da42e8359d72afc2618.js.map} +1 -1
- udata/static/chunks/{8.778091d55cd8ea39af6b.js → 8.54e44b102164ae5e7a67.js} +2 -2
- udata/static/chunks/{8.778091d55cd8ea39af6b.js.map → 8.54e44b102164ae5e7a67.js.map} +1 -1
- udata/static/chunks/{9.033d7e190ca9e226a5d0.js → 9.07515e5187f475bce828.js} +3 -3
- udata/static/chunks/{9.033d7e190ca9e226a5d0.js.map → 9.07515e5187f475bce828.js.map} +1 -1
- udata/static/common.js +1 -1
- udata/static/common.js.map +1 -1
- udata/templates/api/admin.html +1 -1
- udata/templates/mail/user_mail_card.html +1 -1
- udata/tests/api/test_contact_points.py +33 -0
- udata/tests/site/test_site_model.py +29 -1
- udata/tests/test_routing.py +19 -0
- {udata-10.7.1.dev36387.dist-info → udata-10.7.1.dev36429.dist-info}/METADATA +3 -1
- {udata-10.7.1.dev36387.dist-info → udata-10.7.1.dev36429.dist-info}/RECORD +32 -32
- {udata-10.7.1.dev36387.dist-info → udata-10.7.1.dev36429.dist-info}/LICENSE +0 -0
- {udata-10.7.1.dev36387.dist-info → udata-10.7.1.dev36429.dist-info}/WHEEL +0 -0
- {udata-10.7.1.dev36387.dist-info → udata-10.7.1.dev36429.dist-info}/entry_points.txt +0 -0
- {udata-10.7.1.dev36387.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
|
-
|
|
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,
|
|
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/frontend/__init__.py
CHANGED
|
@@ -38,6 +38,14 @@ def static_global(filename, _burst=True, **kwargs):
|
|
|
38
38
|
return assets.cdn_for("static", filename=filename, **kwargs)
|
|
39
39
|
|
|
40
40
|
|
|
41
|
+
@hook.app_template_filter()
|
|
42
|
+
def avatar_placeholder(url):
|
|
43
|
+
if url:
|
|
44
|
+
return url
|
|
45
|
+
|
|
46
|
+
return "data:image/png;base64,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"
|
|
47
|
+
|
|
48
|
+
|
|
41
49
|
def _wrapper(func, name=None, when=None):
|
|
42
50
|
name = name or func.__name__
|
|
43
51
|
if name not in _template_hooks:
|
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,
|
|
50
|
-
"""
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
the
|
|
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
|
-
|
|
59
|
-
|
|
56
|
+
Returns:
|
|
57
|
+
tuple: (document, created)
|
|
60
58
|
"""
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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"""
|
udata/mongo/slug_fields.py
CHANGED
|
@@ -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
|
-
|
|
202
|
+
SlugFollow.objects.get_or_create(
|
|
203
203
|
namespace=ns,
|
|
204
204
|
old_slug=old_slug,
|
|
205
|
-
|
|
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)
|