diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-05-09 13:16:58 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-12-12 12:21:00 +0100 |
commit | 12de821ded4f964c89d1ac758701bcaf4750e7de (patch) | |
tree | 232c6731b19d3a860776a23beeb485ebcc5500ba | |
parent | 5caf4058758d0e5640f1e92d919ffa3fcae0ba27 (diff) | |
download | Ishtar-12de821ded4f964c89d1ac758701bcaf4750e7de.tar.bz2 Ishtar-12de821ded4f964c89d1ac758701bcaf4750e7de.zip |
Geodata: filter edit permissions for geo items
7 files changed, 93 insertions, 12 deletions
diff --git a/archaeological_context_records/templates/ishtar/sheet_contextrecord.html b/archaeological_context_records/templates/ishtar/sheet_contextrecord.html index db952032c..7eb5b4a29 100644 --- a/archaeological_context_records/templates/ishtar/sheet_contextrecord.html +++ b/archaeological_context_records/templates/ishtar/sheet_contextrecord.html @@ -14,6 +14,9 @@ {% with permission_view_own_document=permission_view_own_document %} {% with permission_view_find=permission_view_find %} {% with permission_view_own_find=permission_view_own_find %} +{% with permission_change_own_geovectordata=permission_change_own_geovectordata %} +{% with permission_change_geovectordata=permission_change_geovectordata %} + {% with permission_change_geo=permission_change_own_geovectordata|or_:permission_change_geovectordata %} {% with can_view_documents=permission_view_own_document|or_:permission_view_document %} @@ -346,6 +349,6 @@ {% endif %} </div> -{% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} +{% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endblock %} diff --git a/archaeological_finds/templates/ishtar/sheet_find.html b/archaeological_finds/templates/ishtar/sheet_find.html index af10a8711..b13ff5c96 100644 --- a/archaeological_finds/templates/ishtar/sheet_find.html +++ b/archaeological_finds/templates/ishtar/sheet_find.html @@ -18,6 +18,9 @@ {# trick to set to null non existing variable #} {% with permission_view_document=permission_view_document %} {% with permission_view_own_document=permission_view_own_document %} +{% with permission_change_own_geovectordata=permission_change_own_geovectordata %} +{% with permission_change_geovectordata=permission_change_geovectordata %} + {% with permission_change_geo=permission_change_own_geovectordata|or_:permission_change_geovectordata %} {% with non_modif_treatments_count=item.non_modif_treatments_count %} @@ -541,7 +544,7 @@ <h3>{% if base_find.complete_identifier %}{{ base_find.complete_identifier }}{% else %}{{base_find.short_id}}{% endif %}</h3> {% with current_geolabel=base_find %} {% include "ishtar/blocks/sheet_geographic.html" %} - {% endwith %} + {% endwith %} {% endwith %} {% endfor %} </div> @@ -555,7 +558,7 @@ {% endif %} </div> -{% endwith %} {% endwith %} {% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %} +{% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %}{% endwith %} {% endblock %} diff --git a/archaeological_operations/templates/ishtar/sheet_operation.html b/archaeological_operations/templates/ishtar/sheet_operation.html index e9568d5d7..f884ed435 100644 --- a/archaeological_operations/templates/ishtar/sheet_operation.html +++ b/archaeological_operations/templates/ishtar/sheet_operation.html @@ -18,6 +18,9 @@ {% with permission_view_own_contextrecord=permission_view_own_contextrecord %} {% with permission_view_container=permission_view_container %} {% with permission_view_own_container=permission_view_own_container %} +{% with permission_change_own_geovectordata=permission_change_own_geovectordata %} +{% with permission_change_geovectordata=permission_change_geovectordata %} + {% with permission_change_geo=permission_change_own_geovectordata|or_:permission_change_geovectordata %} {% with display_data=item.data %} @@ -609,6 +612,6 @@ $(document).ready( function () { } ); </script> -{% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} +{% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endblock %}
\ No newline at end of file diff --git a/archaeological_operations/templates/ishtar/sheet_site.html b/archaeological_operations/templates/ishtar/sheet_site.html index e9004d875..b5401c9fb 100644 --- a/archaeological_operations/templates/ishtar/sheet_site.html +++ b/archaeological_operations/templates/ishtar/sheet_site.html @@ -8,6 +8,9 @@ {% endblock %} {% block content %} +{% with permission_change_own_geovectordata=permission_change_own_geovectordata %} +{% with permission_change_geovectordata=permission_change_geovectordata %} + {% with permission_change_geo=permission_change_own_geovectordata|or_:permission_change_geovectordata %} {% with display_geo=item.geodata.count %} @@ -104,5 +107,5 @@ {% with geo_item=item %}{% include "ishtar/blocks/sheet_geographic.html" %}{% endwith %} {% endif %} -{% endwith %} {% endwith %} +{% endwith %} {% endwith %} {% endwith %} {% endwith %} {% endblock %} diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 07aaa18ea..12a5db0df 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -1716,6 +1716,17 @@ class OwnPerms(object): perm = "view_" + self.SLUG return self.can_do(request, perm) + def can_edit(self, request): + if not getattr(request.user, "ishtaruser", None): + return False + ishtaruser = request.user.ishtaruser + slug = self.LONG_SLUG if hasattr(self, "LONG_SLUG") else self.SLUG + if ishtaruser.has_perm("change_" + slug, session=request.session): + return True + if not ishtaruser.has_perm("change_own_" + slug, session=request.session): + return False + return self.is_own(ishtaruser) + def can_do(self, request, action_name): """ Check permission availability for the current object. @@ -1881,7 +1892,7 @@ class OwnPerms(object): def _get_query_owns_dicts(cls, ishtaruser): """ List of query own dict to construct the query. - Each dict are join with an AND operator, each dict key, values are + Each dict is joined with an AND operator, each dict key, values are joined with OR operator """ return [] @@ -2087,7 +2098,9 @@ GEOMETRY_TYPE_LBL = { } -class GeoVectorData(Imported): +class GeoVectorData(Imported, OwnPerms): + SLUG = "geovectordata" + name = models.TextField(_("Name"), default="-") source_content_type = models.ForeignKey( ContentType, related_name="content_type_geovectordata", on_delete=models.CASCADE @@ -2166,6 +2179,45 @@ class GeoVectorData(Imported): name += f" ({str(self.data_type).lower()})" return name + def is_own(self, ishtaruser, alt_query_own=None): + ct = self.source_content_type + model = apps.get_model(ct.app_label, ct.model) + if not hasattr(model, "_get_query_owns_dicts"): + return False + sub_q = model.get_query_owns(ishtaruser) + if not sub_q: + return False + return self.source_id in list( + model.objects.filter(sub_q).values_list("id", flat=True) + ) + + @classmethod + def get_query_owns(cls, ishtaruser): + q = None + for app_label, model_name in ( + ("archaeological_operations", "Operation"), + ("archaeological_operations", "ArchaeologicalSite"), + ("archaeological_context_records", "ContextRecord"), + ("archaeological_finds", "BaseFind"), + ("archaeological_warehouse", "Warehouse"), + ("archaeological_warehouse", "Container"), + ): + model = apps.get_model(app_label, model_name) + sub_q = cls._construct_query_own( + "", model._get_query_owns_dicts(ishtaruser) + ) + q2 = Q( + source_id__in=list(sub_q.values_list("id", flat=True)), + source_content_type__app_label=app_label, + source_content_type__model=model_name.lower(), + ) + if not q: + q = q2 + else: + q |= q2 + + return q + @property def source_label(self): return str(self.source) @@ -2347,9 +2399,12 @@ class GeoVectorData(Imported): for coord in feature["geometry"]["coordinates"] ] geojson_dct["features"] = features - geojson_dct["link_template"] = simple_link_to_window(self).replace( - "999999", "<pk>" - ) + try: + geojson_dct["link_template"] = simple_link_to_window(self).replace( + "999999", "<pk>" + ) + except NoReverseMatch: + pass geojson = json.dumps(geojson_dct) return geojson diff --git a/ishtar_common/templates/ishtar/blocks/sheet_geographic.html b/ishtar_common/templates/ishtar/blocks/sheet_geographic.html index c5a413cc6..69cd67fcc 100644 --- a/ishtar_common/templates/ishtar/blocks/sheet_geographic.html +++ b/ishtar_common/templates/ishtar/blocks/sheet_geographic.html @@ -1,4 +1,4 @@ -{% load i18n window_field %} +{% load i18n ishtar_helpers window_field %} <table id='{{window_id}}-geographic-data' class="table table-striped"> <tr> {% if permission_change_geo %}<th> </th>{% endif %} @@ -13,7 +13,9 @@ </tr> {% for geo in geo_item.geodata.all %} <tr> - {% if permission_change_geo %}<td><a href="#"><i class="fa fa-pencil"></i></a></td>{% endif %} + {% if permission_change_geo %} + <td><a href="#">{% if geo|can_edit_item:request %}<i class="fa fa-pencil"></i></a>{% else %}–{% endif %}</td> + {% endif %} <td>{% if geo.id == geo_item.main_geodata_id %}<i class="fa fa-check-circle text-success" aria-hidden="true"></i>{% else %}–{% endif %}</td> <td>{% if geo.data_type %}{{ geo.data_type }}{% else %}-{% endif %}</td> <td>{{ geo.source_label }}</td> diff --git a/ishtar_common/templatetags/ishtar_helpers.py b/ishtar_common/templatetags/ishtar_helpers.py index 250b5719d..29ed57b08 100644 --- a/ishtar_common/templatetags/ishtar_helpers.py +++ b/ishtar_common/templatetags/ishtar_helpers.py @@ -54,3 +54,15 @@ def is_locked(item, user): if not hasattr(item, "is_locked"): return False return item.is_locked(user) + + +@register.filter +def can_edit_item(item, context): + if hasattr(context, "request"): # WSGIRequest + request = context.request + elif "request" in context: # RequestContext + request = context['request'] + else: + request = context + if item.can_edit(request): + return True |