Skip to content

Commit

Permalink
Merge branch 'master' into geodatadir
Browse files Browse the repository at this point in the history
  • Loading branch information
NyakudyaA authored Jul 2, 2023
2 parents 1cac5f8 + f3a490a commit f083f78
Show file tree
Hide file tree
Showing 23 changed files with 397 additions and 97 deletions.
2 changes: 1 addition & 1 deletion geonode/base/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ def keyword_id(self, obj):


class ResourceBaseAdminForm(autocomplete.FutureModelForm):
keywords = TagField(widget=TaggitSelect2Custom("autocomplete_hierachical_keyword"))
keywords = TagField(widget=TaggitSelect2Custom("autocomplete_hierachical_keyword"), required=False)

def delete_queryset(self, request, queryset):
"""
Expand Down
15 changes: 10 additions & 5 deletions geonode/base/api/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,16 @@ class TKeywordsFilter(BaseFilterBackend):
"""

def filter_queryset(self, request, queryset, view):
return (
self.filter_queryset_GROUP(request, queryset, view)
if "force_and" not in request.GET
else self.filter_queryset_AND(request, queryset, view)
)
# we must make the GET mutable since in the filters, some queryparams are popped
request.GET._mutable = True
try:
return (
self.filter_queryset_GROUP(request, queryset, view)
if "force_and" not in request.GET
else self.filter_queryset_AND(request, queryset, view)
)
finally:
request.GET._mutable = False

def filter_queryset_AND(self, request, queryset, view):
"""
Expand Down
2 changes: 2 additions & 0 deletions geonode/base/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,8 @@ def visitor_ip_address(request):
ip = x_forwarded_for.split(",")[0]
else:
ip = request.META.get("REMOTE_ADDR")
if ip:
ip = re.match(r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", ip)[0]
return ip


Expand Down
8 changes: 4 additions & 4 deletions geonode/base/fixtures/regions.json
Original file line number Diff line number Diff line change
Expand Up @@ -4345,10 +4345,10 @@
"level": 1,
"lft": 464,
"tree_id": 90,
"bbox_x0": 139.572356,
"bbox_x1": -74.531208,
"bbox_y0": -56.267241,
"bbox_y1": 62.0215969
"bbox_x0": 112.921112,
"bbox_x1": -108.87291,
"bbox_y0": -54.640301,
"bbox_y1": 20.41712
}
},
{
Expand Down
7 changes: 7 additions & 0 deletions geonode/documents/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,10 @@ class Meta:
"doc_url",
"metadata",
)

def to_representation(self, obj):
_doc = super(DocumentSerializer, self).to_representation(obj)
# better to hide internal server file path
_doc.pop("file_path")
_doc.pop("doc_file")
return _doc
15 changes: 10 additions & 5 deletions geonode/documents/api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#########################################################################
import os
import logging

from django.contrib.auth import get_user_model
Expand Down Expand Up @@ -139,14 +138,20 @@ def test_creation_should_create_the_doc(self):
}
actual = self.client.post(self.url, data=payload, format="json")
self.assertEqual(201, actual.status_code)
cloned_path = actual.json().get("document", {}).get("file_path", "")[0]
extension = actual.json().get("document", {}).get("extension", "")
self.assertTrue(os.path.exists(cloned_path))
self.assertEqual("xml", extension)
self.assertTrue(Document.objects.filter(title="New document for testing").exists())

if cloned_path:
os.remove(cloned_path)
def test_file_path_and_doc_path_are_not_returned(self):
"""
If file_path and doc_path should not be visible
from the GET payload
"""
actual = self.client.get(self.url)
self.assertEqual(200, actual.status_code)
_doc_payload = actual.json().get("document", {})
self.assertFalse("file_path" in _doc_payload)
self.assertFalse("doc_path" in _doc_payload)

def test_creation_from_url_should_create_the_doc(self):
"""
Expand Down
15 changes: 15 additions & 0 deletions geonode/facets/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
FACET_TYPE_USER = "user"
FACET_TYPE_THESAURUS = "thesaurus"
FACET_TYPE_CATEGORY = "category"
FACET_TYPE_RESOURCETYPE = "resourcetype"

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -86,6 +87,20 @@ def get_facet_items(
"""
pass

def get_topics(self, keys: list, lang="en", **kwargs) -> list:
"""
Return the topics with the requested ids as a list
- list, topic records. A topic record is a dict having these keys:
- key: the key of the items that should be used for filtering
- label: a generic label for the item; the client should try and localize it whenever possible
- localized_label: a localized label for the item
- other facet specific keys
:param keys: the list of the keys of the topics, as returned by the get_facet_items() method
:param lang: the preferred language for the labels
:return: list of items
"""
pass

@classmethod
def register(cls, registry, **kwargs) -> None:
"""
Expand Down
22 changes: 20 additions & 2 deletions geonode/facets/providers/category.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

from django.db.models import Count

from geonode.base.models import TopicCategory
from geonode.facets.models import FacetProvider, DEFAULT_FACET_PAGE_SIZE, FACET_TYPE_CATEGORY

logger = logging.getLogger(__name__)
Expand All @@ -38,7 +39,7 @@ def name(self) -> str:
def get_info(self, lang="en") -> dict:
return {
"name": self.name,
"key": "filter{category__identifier}",
"key": "filter{category.identifier}",
"label": "Category",
"type": FACET_TYPE_CATEGORY,
"hierarchical": False,
Expand All @@ -55,7 +56,9 @@ def get_facet_items(
) -> (int, list):
logger.debug("Retrieving facets for %s", self.name)

q = queryset.values("category__identifier", "category__gn_description", "category__fa_class")
q = queryset.values("category__identifier", "category__gn_description", "category__fa_class").filter(
category__isnull=False
)
if topic_contains:
q = q.filter(category__gn_description=topic_contains)
q = q.annotate(count=Count("owner")).order_by("-count")
Expand All @@ -78,6 +81,21 @@ def get_facet_items(

return cnt, topics

def get_topics(self, keys: list, lang="en", **kwargs) -> list:
q = TopicCategory.objects.filter(identifier__in=keys)

logger.debug(" ---> %s\n\n", q.query)
logger.debug(" ---> %r\n\n", q.all())

return [
{
"key": r.identifier,
"label": r.gn_description,
"fa_class": r.fa_class,
}
for r in q.all()
]

@classmethod
def register(cls, registry, **kwargs) -> None:
registry.register_facet_provider(CategoryFacetProvider())
15 changes: 15 additions & 0 deletions geonode/facets/providers/region.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

from django.db.models import Count

from geonode.base.models import Region
from geonode.facets.models import FacetProvider, DEFAULT_FACET_PAGE_SIZE, FACET_TYPE_PLACE

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -77,6 +78,20 @@ def get_facet_items(

return cnt, topics

def get_topics(self, keys: list, lang="en", **kwargs) -> list:
q = Region.objects.filter(code__in=keys).values("code", "name")

logger.debug(" ---> %s\n\n", q.query)
logger.debug(" ---> %r\n\n", q.all())

return [
{
"key": r["code"],
"label": r["name"],
}
for r in q.all()
]

@classmethod
def register(cls, registry, **kwargs) -> None:
registry.register_facet_provider(RegionFacetProvider())
41 changes: 35 additions & 6 deletions geonode/facets/providers/thesaurus.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@

import logging

from django.db.models import Count
from django.db.models import Count, OuterRef, Subquery

from geonode.base.models import ThesaurusKeyword, ThesaurusKeywordLabel
from geonode.facets.models import FacetProvider, DEFAULT_FACET_PAGE_SIZE, FACET_TYPE_THESAURUS

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -65,37 +66,65 @@ def get_facet_items(

filter = {
"tkeywords__thesaurus__identifier": self._name,
"tkeywords__keyword__lang": lang,
}

if topic_contains:
filter["tkeywords__keyword__label__icontains"] = topic_contains

q = (
queryset.filter(**filter)
.values("tkeywords", "tkeywords__keyword__label", "tkeywords__alt_label")
.values("tkeywords", "tkeywords__alt_label")
.annotate(count=Count("tkeywords"))
.annotate(
localized_label=Subquery(
ThesaurusKeywordLabel.objects.filter(keyword=OuterRef("tkeywords"), lang=lang).values("label")
)
)
.order_by("-count")
)

logger.debug(" ---> %s\n\n", q.query)

cnt = q.count()

logger.info("Found %d facets for %s", cnt, self._name)
logger.debug(" ---> %s\n\n", q.query)
logger.debug(" ---> %r\n\n", q.all())

topics = [
{
"key": r["tkeywords"],
"label": r["tkeywords__keyword__label"] or r["tkeywords__alt_label"],
"is_localized": r["tkeywords__keyword__label"] is not None,
"label": r["localized_label"] or r["tkeywords__alt_label"],
"is_localized": r["localized_label"] is not None,
"count": r["count"],
}
for r in q[start:end].all()
]

return cnt, topics

def get_topics(self, keys: list, lang="en", **kwargs) -> list:
q = (
ThesaurusKeyword.objects.filter(id__in=keys)
.values("id", "alt_label")
.annotate(
localized_label=Subquery(
ThesaurusKeywordLabel.objects.filter(keyword=OuterRef("id"), lang=lang).values("label")
)
)
)

logger.debug(" ---> %s\n\n", q.query)
logger.debug(" ---> %r\n\n", q.all())

return [
{
"key": r["id"],
"label": r["localized_label"] or r["alt_label"],
"is_localized": r["localized_label"] is not None,
}
for r in q.all()
]

@classmethod
def register(cls, registry, **kwargs) -> None:
# registry.register_facet_provider(CategoryFacetProvider())
Expand Down
16 changes: 15 additions & 1 deletion geonode/facets/providers/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import logging

from django.contrib.auth import get_user_model
from django.db.models import Count

from geonode.facets.models import FacetProvider, DEFAULT_FACET_PAGE_SIZE, FACET_TYPE_USER
Expand Down Expand Up @@ -70,14 +71,27 @@ def get_facet_items(
{
"key": r["owner"],
"label": r["owner__username"],
"localized_label": r["owner__username"],
"count": r["count"],
}
for r in q[start:end]
]

return cnt, topics

def get_topics(self, keys: list, lang="en", **kwargs) -> list:
q = get_user_model().objects.filter(id__in=keys).values("id", "username")

logger.debug(" ---> %s\n\n", q.query)
logger.debug(" ---> %r\n\n", q.all())

return [
{
"key": r["id"],
"label": r["username"],
}
for r in q.all()
]

@classmethod
def register(cls, registry, **kwargs) -> None:
registry.register_facet_provider(OwnerFacetProvider())
Loading

0 comments on commit f083f78

Please sign in to comment.