|
17 | 17 | # along with this program. If not, see <http://www.gnu.org/licenses/>.
|
18 | 18 | #
|
19 | 19 | #########################################################################
|
| 20 | +from django.apps import apps |
20 | 21 | from django.conf import settings
|
21 | 22 | from django.contrib.auth import get_user_model
|
22 | 23 |
|
|
45 | 46 | UserSerializer,
|
46 | 47 | PermSpecSerialiazer,
|
47 | 48 | GroupProfileSerializer,
|
48 |
| - ResourceBaseSerializer |
| 49 | + ResourceBaseSerializer, |
| 50 | + ResourceBaseTypesSerializer |
49 | 51 | )
|
50 | 52 | from .pagination import GeoNodeApiPagination
|
51 | 53 |
|
@@ -145,6 +147,71 @@ class ResourceBaseViewSet(DynamicModelViewSet):
|
145 | 147 | serializer_class = ResourceBaseSerializer
|
146 | 148 | pagination_class = GeoNodeApiPagination
|
147 | 149 |
|
| 150 | + def _filtered(self, request, filter): |
| 151 | + paginator = GeoNodeApiPagination() |
| 152 | + paginator.page_size = request.GET.get('page_size', 10) |
| 153 | + resources = ResourceBase.objects.filter(**filter) |
| 154 | + exclude = [] |
| 155 | + for resource in resources: |
| 156 | + if not request.user.is_superuser and \ |
| 157 | + not request.user.has_perm('view_resourcebase', resource.get_self_resource()): |
| 158 | + exclude.append(resource.id) |
| 159 | + resources = resources.exclude(id__in=exclude) |
| 160 | + result_page = paginator.paginate_queryset(resources, request) |
| 161 | + serializer = ResourceBaseSerializer(result_page, embed=True, many=True) |
| 162 | + return paginator.get_paginated_response({"resources": serializer.data}) |
| 163 | + |
| 164 | + @extend_schema(methods=['get'], responses={200: ResourceBaseSerializer(many=True)}, |
| 165 | + description="API endpoint allowing to retrieve the approved Resources.") |
| 166 | + @action(detail=False, methods=['get']) |
| 167 | + def approved(self, request): |
| 168 | + return self._filtered(request, {"is_approved": True}) |
| 169 | + |
| 170 | + @extend_schema(methods=['get'], responses={200: ResourceBaseSerializer(many=True)}, |
| 171 | + description="API endpoint allowing to retrieve the published Resources.") |
| 172 | + @action(detail=False, methods=['get']) |
| 173 | + def published(self, request): |
| 174 | + return self._filtered(request, {"is_published": True}) |
| 175 | + |
| 176 | + @extend_schema(methods=['get'], responses={200: ResourceBaseSerializer(many=True)}, |
| 177 | + description="API endpoint allowing to retrieve the featured Resources.") |
| 178 | + @action(detail=False, methods=['get']) |
| 179 | + def featured(self, request): |
| 180 | + return self._filtered(request, {"featured": True}) |
| 181 | + |
| 182 | + @extend_schema(methods=['get'], responses={200: ResourceBaseTypesSerializer()}, |
| 183 | + description=""" |
| 184 | + Returns the list of available ResourceBase polymorphic_ctypes. |
| 185 | +
|
| 186 | + the mapping looks like: |
| 187 | + ``` |
| 188 | + { |
| 189 | + "resource_types": [ |
| 190 | + "layer", |
| 191 | + "map", |
| 192 | + "document", |
| 193 | + "service" |
| 194 | + ] |
| 195 | + } |
| 196 | + ``` |
| 197 | + """) |
| 198 | + @action(detail=False, methods=['get']) |
| 199 | + def resource_types(self, request): |
| 200 | + resource_types = [] |
| 201 | + for _model in apps.get_models(): |
| 202 | + if _model.__name__ == "ResourceBase": |
| 203 | + resource_types = [_m.__name__.lower() for _m in _model.__subclasses__()] |
| 204 | + if "geoapp" in resource_types: |
| 205 | + from geonode.geoapps.models import GeoApp |
| 206 | + resource_types.remove("geoapp") |
| 207 | + for label, app in apps.app_configs.items(): |
| 208 | + if hasattr(app, 'type') and app.type == 'GEONODE_APP': |
| 209 | + if hasattr(app, 'default_model'): |
| 210 | + _model = apps.get_model(label, app.default_model) |
| 211 | + if issubclass(_model, GeoApp): |
| 212 | + resource_types.append(_model.__name__.lower()) |
| 213 | + return Response({"resource_types": resource_types}) |
| 214 | + |
148 | 215 | @extend_schema(methods=['get'], responses={200: PermSpecSerialiazer()},
|
149 | 216 | description="""
|
150 | 217 | Gets an object's the permission levels based on the perm_spec JSON.
|
|
0 commit comments