diff --git a/src/servala/core/models/organization.py b/src/servala/core/models/organization.py
index 26435f3..bbcc16f 100644
--- a/src/servala/core/models/organization.py
+++ b/src/servala/core/models/organization.py
@@ -468,6 +468,7 @@ class OrganizationInvitation(ServalaModelMixin, models.Model):
class urls(urlman.Urls):
accept = "/invitations/{self.secret}/accept/"
+ delete = "{self.organization.urls.details}invitations/{self.pk}/delete/"
class Meta:
verbose_name = _("Organization invitation")
diff --git a/src/servala/core/rules.py b/src/servala/core/rules.py
index cf4dc1c..e1a0992 100644
--- a/src/servala/core/rules.py
+++ b/src/servala/core/rules.py
@@ -14,20 +14,26 @@ def has_organization_role(user, org, roles):
@rules.predicate
def is_organization_owner(user, obj):
+ from servala.core.models.organization import OrganizationRole
+
if hasattr(obj, "organization"):
org = obj.organization
else:
org = obj
- return has_organization_role(user, org, ["owner"])
+ return has_organization_role(user, org, [OrganizationRole.OWNER])
@rules.predicate
def is_organization_admin(user, obj):
+ from servala.core.models.organization import OrganizationRole
+
if hasattr(obj, "organization"):
org = obj.organization
else:
org = obj
- return has_organization_role(user, org, ["owner", "admin"])
+ return has_organization_role(
+ user, org, [OrganizationRole.OWNER, OrganizationRole.ADMIN]
+ )
@rules.predicate
diff --git a/src/servala/frontend/templates/frontend/organizations/update.html b/src/servala/frontend/templates/frontend/organizations/update.html
index 2785e9a..73c2c69 100644
--- a/src/servala/frontend/templates/frontend/organizations/update.html
+++ b/src/servala/frontend/templates/frontend/organizations/update.html
@@ -67,43 +67,66 @@
+{% endpartialdef members-list %}
+{% partialdef pending-invitations-card %}
{% if pending_invitations %}
-
- {% translate "Pending Invitations" %}
-
-
-
-
-
- | {% translate "Email" %} |
- {% translate "Role" %} |
- {% translate "Sent" %} |
- {% translate "Link" %} |
-
-
-
- {% for invitation in pending_invitations %}
-
- | {{ invitation.email }} |
-
-
- {{ invitation.get_role_display }}
-
- |
- {{ invitation.created_at|date:"Y-m-d H:i" }} |
-
-
- |
-
- {% endfor %}
-
-
+
+
+
+
+
+
+
+
+ | {% translate "Email" %} |
+ {% translate "Role" %} |
+ {% translate "Sent" %} |
+ {% translate "Actions" %} |
+
+
+
+ {% for invitation in pending_invitations %}
+
+ | {{ invitation.email }} |
+
+
+ {{ invitation.get_role_display }}
+
+ |
+ {{ invitation.created_at|date:"Y-m-d H:i" }} |
+
+
+
+ |
+
+ {% endfor %}
+
+
+
+
+
{% endif %}
-{% endpartialdef members-list %}
+{% endpartialdef pending-invitations-card %}
{% block content %}
@@ -214,6 +237,7 @@
{% partial members-list %}
+ {% partial pending-invitations-card %}