forked from data.coop/membersystem
We want a list of users, not memberships.
This commit is contained in:
parent
bc00b32c46
commit
cf99c3f40e
|
@ -38,9 +38,9 @@ class Permission:
|
|||
)
|
||||
|
||||
|
||||
ADMINISTRATE_MEMBERSHIPS = Permission(
|
||||
name=_("Can administrate memberships"),
|
||||
codename="administrate_memberships",
|
||||
ADMINISTRATE_MEMBERS = Permission(
|
||||
name=_("Can administrate members"),
|
||||
codename="administrate_members",
|
||||
app_label="membership",
|
||||
model="membership",
|
||||
)
|
||||
|
|
|
@ -24,3 +24,7 @@ def get_memberships(
|
|||
memberships = memberships.filter(period=period)
|
||||
|
||||
return memberships
|
||||
|
||||
|
||||
def get_users():
|
||||
return User.objects.all()
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
{% extends "base.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% for period in subscription_periods %}
|
||||
<h3>{{ period }}</h3>
|
||||
{% for membership in period.membership_set.all %}
|
||||
<p>{{ membership.user.username }}</p>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
|
||||
{% endblock %}
|
|
@ -1,11 +1,13 @@
|
|||
from django.contrib.auth.decorators import login_required
|
||||
from django.contrib.auth.decorators import permission_required
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from zen_queries import render
|
||||
|
||||
from .permissions import ADMINISTRATE_MEMBERSHIPS
|
||||
from .permissions import ADMINISTRATE_MEMBERS
|
||||
from .selectors import get_memberships
|
||||
from .selectors import get_subscription_periods
|
||||
from .selectors import get_users
|
||||
from utils.view_utils import base_view_context
|
||||
from utils.view_utils import render_list
|
||||
|
||||
|
||||
@login_required
|
||||
|
@ -30,16 +32,17 @@ def membership_overview(request):
|
|||
|
||||
|
||||
@login_required
|
||||
@permission_required(ADMINISTRATE_MEMBERSHIPS.path)
|
||||
def membership_admin(request):
|
||||
subscription_periods = get_subscription_periods()
|
||||
@permission_required(ADMINISTRATE_MEMBERS.path)
|
||||
def members_admin(request):
|
||||
users = get_users()
|
||||
|
||||
context = base_view_context(request) | {
|
||||
"subscription_periods": subscription_periods,
|
||||
}
|
||||
|
||||
return render(
|
||||
return render_list(
|
||||
request=request,
|
||||
template_name="membership/membership_admin.html",
|
||||
context=context,
|
||||
objects=users,
|
||||
columns=[
|
||||
("username", _("Username")),
|
||||
("first_name", _("First name")),
|
||||
("last_name", _("Last name")),
|
||||
("email", _("Email")),
|
||||
],
|
||||
)
|
||||
|
|
|
@ -192,8 +192,8 @@
|
|||
<span>{% trans "Admin" %}</span>
|
||||
</h6>
|
||||
<ul class="nav flex-column mb-2">
|
||||
<li class="nav-item {% active_path "membership-admin" "active" %}">
|
||||
<a class="nav-link" href="{% url "membership-admin" %}">
|
||||
<li class="nav-item {% active_path "admin-members" "active" %}">
|
||||
<a class="nav-link" href="{% url "admin-members" %}">
|
||||
<span data-feather="file-text"></span>
|
||||
{% trans "Members" %}
|
||||
</a>
|
||||
|
|
|
@ -7,14 +7,14 @@ from django.urls import path
|
|||
|
||||
from .views import index
|
||||
from .views import services_overview
|
||||
from membership.views import membership_admin
|
||||
from membership.views import members_admin
|
||||
from membership.views import membership_overview
|
||||
|
||||
urlpatterns = [
|
||||
path("", login_required(index), name="index"),
|
||||
path("services/", login_required(services_overview), name="services-overview"),
|
||||
path("membership/", membership_overview, name="membership-overview"),
|
||||
path("membership/admin/", membership_admin, name="membership-admin"),
|
||||
path("admin/members/", members_admin, name="admin-members"),
|
||||
path("accounts/", include("allauth.urls")),
|
||||
path("admin/", admin.site.urls),
|
||||
]
|
||||
|
|
23
src/utils/templates/utils/list.html
Normal file
23
src/utils/templates/utils/list.html
Normal file
|
@ -0,0 +1,23 @@
|
|||
{% extends "base.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
{% for column in columns %}
|
||||
<th scope="col">{{ column }}</th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
{% for row in object_rows %}
|
||||
<tr>
|
||||
{% for value in row %}
|
||||
<td>{{ value }}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
{% endblock %}
|
|
@ -1,6 +1,34 @@
|
|||
from django.contrib.sites.shortcuts import get_current_site as django_get_current_site
|
||||
from django.db.models import Model
|
||||
from django.http import HttpRequest
|
||||
from django.http import HttpResponse
|
||||
from zen_queries import render
|
||||
|
||||
|
||||
def base_view_context(request):
|
||||
"""Include the current site in the context."""
|
||||
return {"site": django_get_current_site(request)}
|
||||
|
||||
|
||||
def render_list(
|
||||
request: HttpRequest,
|
||||
objects: list["Model"],
|
||||
columns: list[tuple[str, str]],
|
||||
) -> HttpResponse:
|
||||
# TODO: Actions per object
|
||||
# TODO: Listwide actions
|
||||
|
||||
object_rows = [[getattr(obj, column[0]) for column in columns] for obj in objects]
|
||||
|
||||
column_labels = [column[1] for column in columns]
|
||||
|
||||
context = base_view_context(request) | {
|
||||
"object_rows": object_rows,
|
||||
"columns": column_labels,
|
||||
}
|
||||
|
||||
return render(
|
||||
request=request,
|
||||
template_name="utils/list.html",
|
||||
context=context,
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue