diff --git a/apps/member/tables.py b/apps/member/tables.py index bc40368..a967692 100644 --- a/apps/member/tables.py +++ b/apps/member/tables.py @@ -43,8 +43,24 @@ class UserTable(tables.Table): section = tables.Column(accessor='profile__section') + # Override the column to let replace the URL + email = tables.EmailColumn(linkify=lambda record: "mailto:{}".format(record.email)) + balance = tables.Column(accessor='note__balance', verbose_name=_("Balance")) + def render_email(self, record, value): + # Replace the email by a dash if the user can't see the profile detail + # Replace also the URL + if not PermissionBackend.check_perm(get_current_authenticated_user(), "member.view_profile", record.profile): + value = "—" + record.email = value + return value + + def render_section(self, record, value): + return value \ + if PermissionBackend.check_perm(get_current_authenticated_user(), "member.view_profile", record.profile) \ + else "—" + def render_balance(self, record, value): return pretty_money(value)\ if PermissionBackend.check_perm(get_current_authenticated_user(), "note.view_note", record.note) else "—" diff --git a/apps/member/templates/member/includes/profile_info.html b/apps/member/templates/member/includes/profile_info.html index b7f2fe7..e008ec6 100644 --- a/apps/member/templates/member/includes/profile_info.html +++ b/apps/member/templates/member/includes/profile_info.html @@ -25,25 +25,27 @@ -
{% trans 'section'|capfirst %}
-
{{ user_object.profile.section }}
+ {% if "member.view_profile"|has_perm:user_object.profile %} +
{% trans 'section'|capfirst %}
+
{{ user_object.profile.section }}
-
{% trans 'email'|capfirst %}
-
{{ user_object.email }}
+
{% trans 'email'|capfirst %}
+
{{ user_object.email }}
-
{% trans 'phone number'|capfirst %}
-
{{ user_object.profile.phone_number }} -
+
{% trans 'phone number'|capfirst %}
+
{{ user_object.profile.phone_number }} +
-
{% trans 'address'|capfirst %}
-
{{ user_object.profile.address }}
+
{% trans 'address'|capfirst %}
+
{{ user_object.profile.address }}
- {% if user_object.note and "note.view_note"|has_perm:user_object.note %} -
{% trans 'balance'|capfirst %}
-
{{ user_object.note.balance | pretty_money }}
+ {% if user_object.note and "note.view_note"|has_perm:user_object.note %} +
{% trans 'balance'|capfirst %}
+
{{ user_object.note.balance | pretty_money }}
-
{% trans 'paid'|capfirst %}
-
{{ user_object.profile.paid|yesno }}
+
{% trans 'paid'|capfirst %}
+
{{ user_object.profile.paid|yesno }}
+ {% endif %} {% endif %} diff --git a/apps/member/views.py b/apps/member/views.py index 9a585ed..73569c8 100644 --- a/apps/member/views.py +++ b/apps/member/views.py @@ -70,10 +70,11 @@ class UserUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): form.fields['email'].required = True form.fields['email'].help_text = _("This address must be valid.") - context['profile_form'] = self.profile_form(instance=context['user_object'].profile, - data=self.request.POST if self.request.POST else None) - if not self.object.profile.report_frequency: - del context['profile_form'].fields["last_report"] + if PermissionBackend.check_perm(self.request.user, "member.change_profile", context['user_object'].profile): + context['profile_form'] = self.profile_form(instance=context['user_object'].profile, + data=self.request.POST if self.request.POST else None) + if not self.object.profile.report_frequency: + del context['profile_form'].fields["last_report"] return context @@ -677,11 +678,13 @@ class ClubAddMemberView(ProtectQuerysetMixin, ProtectedCreateView): if not last_name or not first_name or (not bank and credit_type.special_type == "Chèque"): if not last_name: form.add_error('last_name', _("This field is required.")) + error = True if not first_name: form.add_error('first_name', _("This field is required.")) + error = True if not bank and credit_type.special_type == "Chèque": form.add_error('bank', _("This field is required.")) - return self.form_invalid(form) + error = True return not error diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index 8c7ec9b..7700f3e 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -2839,6 +2839,22 @@ "description": "Voir n'importe quel profil non encore inscrit" } }, + { + "model": "permission.permission", + "pk": 182, + "fields": { + "model": [ + "auth", + "user" + ], + "query": "{\"memberships__club__name\": \"BDE\", \"memberships__roles__name\": \"Adhérent BDE\", \"memberships__date_start__lte\": [\"today\"], \"memberships__date_end__gte\": [\"today\"]}", + "type": "view", + "mask": 2, + "field": "", + "permanent": false, + "description": "Voir n'importe quel utilisateur qui est adhérent BDE" + } + }, { "model": "permission.role", "pk": 1, @@ -2971,14 +2987,14 @@ 62, 127, 133, - 135, 136, 141, 142, 150, 166, 167, - 168 + 168, + 182 ] } }, @@ -3271,7 +3287,12 @@ 170, 171, 176, - 177 + 177, + 178, + 179, + 180, + 181, + 182 ] } }, @@ -3466,7 +3487,9 @@ 56, 57, 58, + 137, 143, + 147, 150, 166, 167, @@ -3474,7 +3497,8 @@ 176, 177, 180, - 181 + 181, + 182 ] } }, diff --git a/apps/permission/models.py b/apps/permission/models.py index 1721489..9c1b2e6 100644 --- a/apps/permission/models.py +++ b/apps/permission/models.py @@ -45,6 +45,7 @@ class InstancedPermission: with transaction.atomic(): sid = transaction.savepoint() for o in self.model.model_class().objects.filter(pk=0).all(): + o._no_signal = True o._force_delete = True Model.delete(o) # An object with pk 0 wouldn't deleted. That's not normal, we alert admins. @@ -62,10 +63,6 @@ class InstancedPermission: obj._no_signal = True Model.save(obj, force_insert=True) ret = self.model.model_class().objects.filter(self.query & Q(pk=0)).exists() - # Delete testing object - obj._no_signal = True - obj._force_delete = True - Model.delete(obj) transaction.savepoint_rollback(sid) return ret diff --git a/apps/permission/views.py b/apps/permission/views.py index d76a235..d77133d 100644 --- a/apps/permission/views.py +++ b/apps/permission/views.py @@ -51,8 +51,10 @@ class ProtectQuerysetMixin: # No worry if the user change the hidden fields: a 403 error will be performed if the user tries to make # a custom request. # We could also delete the field, but some views might be affected. + meta = form.instance._meta for key in form.base_fields: - if not PermissionBackend.check_perm(self.request.user, "wei.change_weiregistration_" + key, self.object): + if not PermissionBackend.check_perm(self.request.user, + f"{meta.app_label}.change_{meta.model_name}_" + key, self.object): form.fields[key].widget = HiddenInput() return form