|
31 | 31 | from celery.exceptions import TimeoutError
|
32 | 32 |
|
33 | 33 | from django.contrib.gis.geos import GEOSGeometry
|
| 34 | +from django.core.exceptions import PermissionDenied |
34 | 35 | from django.template.response import TemplateResponse
|
35 | 36 | from requests import Request
|
36 | 37 | from itertools import chain
|
|
63 | 64 | from django.forms.utils import ErrorList
|
64 | 65 |
|
65 | 66 | from geonode.base.auth import get_or_create_token
|
66 |
| -from geonode.base.forms import CategoryForm, TKeywordForm |
| 67 | +from geonode.base.forms import CategoryForm, TKeywordForm, BatchPermissionsForm |
67 | 68 | from geonode.base.views import batch_modify
|
68 | 69 | from geonode.base.models import (
|
69 | 70 | Thesaurus,
|
|
82 | 83 | from geonode.layers.utils import (
|
83 | 84 | file_upload,
|
84 | 85 | is_raster,
|
85 |
| - is_vector) |
| 86 | + is_vector, |
| 87 | + set_layers_permissions) |
86 | 88 |
|
87 | 89 | from geonode.maps.models import Map
|
88 | 90 | from geonode.services.models import Service
|
@@ -1611,6 +1613,80 @@ def layer_batch_metadata(request, ids):
|
1611 | 1613 | return batch_modify(request, ids, 'Layer')
|
1612 | 1614 |
|
1613 | 1615 |
|
| 1616 | +def batch_permissions(request, ids, model): |
| 1617 | + Resource = None |
| 1618 | + if model == 'Layer': |
| 1619 | + Resource = Layer |
| 1620 | + if not Resource or not request.user.is_superuser: |
| 1621 | + raise PermissionDenied |
| 1622 | + |
| 1623 | + template = 'base/batch_permissions.html' |
| 1624 | + |
| 1625 | + if "cancel" in request.POST: |
| 1626 | + return HttpResponseRedirect( |
| 1627 | + '/admin/{model}s/{model}/'.format(model=model.lower()) |
| 1628 | + ) |
| 1629 | + |
| 1630 | + if request.method == 'POST': |
| 1631 | + form = BatchPermissionsForm(request.POST) |
| 1632 | + if form.is_valid(): |
| 1633 | + _data = form.cleaned_data |
| 1634 | + resources_names = [] |
| 1635 | + for resource in Resource.objects.filter(id__in=ids.split(',')): |
| 1636 | + resources_names.append(resource.name) |
| 1637 | + users_usernames = [_data['user'].username, ] if _data['user'] else None |
| 1638 | + groups_names = [_data['group'].name, ] if _data['group'] else None |
| 1639 | + if users_usernames and 'AnonymousUser' in users_usernames and \ |
| 1640 | + (not groups_names or 'anonymous' not in groups_names): |
| 1641 | + if not groups_names: |
| 1642 | + groups_names = [] |
| 1643 | + groups_names.append('anonymous') |
| 1644 | + if groups_names and 'anonymous' in groups_names and \ |
| 1645 | + (not users_usernames or 'AnonymousUser' not in users_usernames): |
| 1646 | + if not users_usernames: |
| 1647 | + users_usernames = [] |
| 1648 | + users_usernames.append('AnonymousUser') |
| 1649 | + delete_flag = _data['mode'] == 'unset' |
| 1650 | + permissions_names = _data['permission_type'] |
| 1651 | + if permissions_names: |
| 1652 | + for permissions_name in permissions_names: |
| 1653 | + set_layers_permissions( |
| 1654 | + permissions_name, resources_names, users_usernames, groups_names, delete_flag |
| 1655 | + ) |
| 1656 | + return HttpResponseRedirect( |
| 1657 | + '/admin/{model}s/{model}/'.format(model=model.lower()) |
| 1658 | + ) |
| 1659 | + return render( |
| 1660 | + request, |
| 1661 | + template, |
| 1662 | + context={ |
| 1663 | + 'form': form, |
| 1664 | + 'ids': ids, |
| 1665 | + 'model': model, |
| 1666 | + } |
| 1667 | + ) |
| 1668 | + |
| 1669 | + form = BatchPermissionsForm( |
| 1670 | + { |
| 1671 | + 'permission_type': ('r', ), |
| 1672 | + 'mode': 'set' |
| 1673 | + }) |
| 1674 | + return render( |
| 1675 | + request, |
| 1676 | + template, |
| 1677 | + context={ |
| 1678 | + 'form': form, |
| 1679 | + 'ids': ids, |
| 1680 | + 'model': model, |
| 1681 | + } |
| 1682 | + ) |
| 1683 | + |
| 1684 | + |
| 1685 | +@login_required |
| 1686 | +def layer_batch_permissions(request, ids): |
| 1687 | + return batch_permissions(request, ids, 'Layer') |
| 1688 | + |
| 1689 | + |
1614 | 1690 | def layer_view_counter(layer_id, viewer):
|
1615 | 1691 | _l = Layer.objects.get(id=layer_id)
|
1616 | 1692 | _u = get_user_model().objects.get(username=viewer)
|
|
0 commit comments