Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/website/shared/listeners/cache_suggestions.py
Original file line number Diff line number Diff line change
Expand Up @@ -317,10 +317,12 @@ def maintainers_list(packages: dict, edits: list[MaintainersEdit]) -> list[dict]
to_skip_or_seen: set[int] = {
m.maintainer.github_id
for m in edits
if m.type == MaintainersEdit.EditType.REMOVE
if m.edit_type == MaintainersEdit.EditType.REMOVE
}
to_add: list[dict] = [
to_dict(m.maintainer) for m in edits if m.type == MaintainersEdit.EditType.ADD
to_dict(m.maintainer)
for m in edits
if m.edit_type == MaintainersEdit.EditType.ADD
]

maintainers: list[dict] = list()
Expand Down
1 change: 1 addition & 0 deletions src/website/shared/tests/test_github_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from django.conf import settings
from django.contrib.auth.models import User
from django.test import TestCase

from shared.auth import isadmin, iscommitter
from shared.auth.github_state import GithubState, set_groups_for_new_user
from shared.auth.github_webhook import handle_webhook
Expand Down
63 changes: 60 additions & 3 deletions src/website/webview/static/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,8 @@ article .nixpkgs-packages {
display: none;
}

.nixpkgs-package {
.nixpkgs-package,
.nixpkg {
flex-grow: 1;
border: 1px solid var(--grey);
border-radius: 5px;
Expand Down Expand Up @@ -830,9 +831,8 @@ article .nixpkgs-packages {
margin-top: 1em;
}

.maintainers ul {
.maintainers article {
margin: 0;
list-style: none;
padding-left: 1em;
}

Expand All @@ -850,6 +850,63 @@ a:focus {
text-decoration: underline;
}

.maintainers-list {
display: flex;
flex-direction: column;
margin-left: 1em;
}

.maintainer-container {
display: flex;
flex-direction: row;
align-items: center;
height: 2em;
}

.maintainer-container input {
margin: 0;
appearance: none;
width: 2em;
height: 2em;
cursor: pointer;
}

.maintainer-container button {
position: relative;
padding: 0;
border: none;
background: none;
text-align: center;
cursor: pointer;
}

.maintainer-edit-add button::after {
top: -0.2em;
content: "↺";
font-weight: 700;
font-size: 1.5em;
color: var(--grey);
}

.maintainer-edit-remove button::after {
top: 0.2em;
content: "🗑";
text-align: center;
font-size: 1.2em;
color: var(--dark-grey);
}

.maintainer-container input ~ article {
margin: 0;
padding: 0;
}

.maintainer-container .maintainer-edit-add article,
.maintainer-container .maintainer-edit-add a {
color: var(--grey);
text-decoration: line-through;
}

.suggestion .change-issue-state {
display: flex;
justify-content: space-between;
Expand Down
7 changes: 7 additions & 0 deletions src/website/webview/templates/components/maintainer.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<article class="maintainer">
<a class="github-id" href="https://github.com/{{ maintainer.github | urlencode }}">@{{ maintainer.github }}</a>
{{ maintainer.name }}
{% if maintainer.email %}
&lt;<a class="email" href="mailto:{{maintainer.email | urlencode}}">{{ maintainer.email }}</a>&gt;
{% endif %}
</article>
19 changes: 11 additions & 8 deletions src/website/webview/templates/components/maintainers_list.html
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
{% load viewutils %}

{% if maintainers %}
<details class="maintainers">
<summary>
Notify package maintainers: {{ maintainers | length }}
</summary>
<ul>

<div class="maintainers-list">
{% for maintainer in maintainers %}
<li class="maintainer">
<a class="github-id" href="https://github.com/{{ maintainer.github | urlencode }}">@{{ maintainer.github }}</a>
{{ maintainer.name }}
{% if maintainer.email %}
&lt;<a class="email" href="mailto:{{maintainer.email | urlencode}}">{{ maintainer.email }}</a>&gt;
<div class="maintainer-container">
{% if selectable %}
{% selectable_maintainer maintainer %}
{% else %}
{% maintainer maintainer %}
{% endif %}
</li>
</div>
{% endfor %}
</ul>
</div>
</details>
{% endif %}
15 changes: 13 additions & 2 deletions src/website/webview/templates/components/nixpkgs_package_list.html
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
{% load viewutils %}

<div class="nixpkgs-packages">
{% for attribute_name, pdata in packages.items %}
{% for attribute, pdata in packages.items %}
<div class="nixpkgs-package-container">
{% nixpkgs_package attribute_name pdata %}
{% if selectable %}
<input
type="checkbox"
name="derivation_ids"
value="{{ pdata.derivation_ids|join:","}}"
checked
hx-post=""
hx-swap="none"
hx-indicator="this .state-change-indicator"
/>
{% endif %}
{% nixpkgs_package attribute pdata %}
</div>
{% endfor %}
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{% load viewutils %}

<div class="maintainer-container {% if deleted %} maintainer-edit-add{% else %} maintainer-edit-remove{%endif %}">
<button
type="submit"
name="edit_maintainer_id"
value="{{ maintainer.github_id }}"
hx-post="{% url 'webview:edit_maintainers' %}"
hx-swap="outerHTML"
hx-target="closest .maintainer-container"
hx-indicator="this .state-change-indicator"
/>
</button>
{% maintainer maintainer %}
</div>

This file was deleted.

6 changes: 5 additions & 1 deletion src/website/webview/templates/components/suggestion.html
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,11 @@
{% nixpkgs_package_list cached_suggestion.packages %}
{% endif %}

{% maintainers_list cached_suggestion.maintainers %}
{% if status_filter == "pending" or status_filter == "accepted" %}
{% selectable_maintainers_list cached_suggestion.maintainers %}
{% else %}
{% maintainers_list cached_suggestion.maintainers %}
{% endif %}

{% if user|is_maintainer_or_admin %}
<div class="change-issue-state">
Expand Down
57 changes: 51 additions & 6 deletions src/website/webview/templatetags/viewutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ class PackageList(TypedDict):

class PackageListContext(TypedDict):
packages: PackageList
selectable: bool


class AffectedContext(TypedDict):
Expand All @@ -59,6 +60,20 @@ class Maintainer(TypedDict):
github_id: int


class MaintainerContext(TypedDict):
maintainer: Maintainer


class SelectableMaintainerContext(TypedDict):
maintainer: Maintainer
deleted: bool


class MaintainersListContext(TypedDict):
maintainers: list[Maintainer]
selectable: bool


@register.filter
def getitem(dictionary: dict, key: str) -> Any | None:
return dictionary.get(key)
Expand Down Expand Up @@ -145,7 +160,7 @@ def nixpkgs_package(attribute_name: str, pdata: Package) -> PackageContext:
return {"attribute_name": attribute_name, "pdata": pdata}


@register.inclusion_tag("components/selectable_nixpkgs_package_list.html")
@register.inclusion_tag("components/nixpkgs_package_list.html")
def selectable_nixpkgs_package_list(packages: PackageList) -> PackageListContext:
"""Renders the nixpkgs package list with additional checkboxes to have packages selectable.

Expand All @@ -156,10 +171,11 @@ def selectable_nixpkgs_package_list(packages: PackageList) -> PackageListContext
Context dictionary for the template

Example:
{% package_list package_dict %}
{% selectable_nixpkgs_package_list package_dict %}
"""
return {
"packages": packages,
"selectable": True,
}


Expand All @@ -174,10 +190,11 @@ def nixpkgs_package_list(packages: PackageList) -> PackageListContext:
Context dictionary for the template

Example:
{% package_list package_dict %}
{% nixpkgs_package_list package_dict %}
"""
return {
"packages": packages,
"selectable": False,
}


Expand All @@ -196,6 +213,34 @@ def suggestion_activity_log(

@register.inclusion_tag("components/maintainers_list.html")
def maintainers_list(
maintainers: list[dict],
) -> dict[str, list[dict]]:
return {"maintainers": maintainers}
maintainers: list[Maintainer],
) -> MaintainersListContext:
return {
"maintainers": maintainers,
"selectable": False,
}


@register.inclusion_tag("components/maintainers_list.html")
def selectable_maintainers_list(
maintainers: list[Maintainer],
) -> MaintainersListContext:
return {
"maintainers": maintainers,
"selectable": True,
}


@register.inclusion_tag("components/maintainer.html")
def maintainer(
maintainer: Maintainer,
) -> MaintainerContext:
return {"maintainer": maintainer}


@register.inclusion_tag("components/selectable_maintainer.html")
def selectable_maintainer(
maintainer: Maintainer,
deleted: bool = False,
) -> SelectableMaintainerContext:
return {"maintainer": maintainer, "deleted": deleted}
7 changes: 7 additions & 0 deletions src/website/webview/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
NixderivationPerChannelView,
NixpkgsIssueListView,
NixpkgsIssueView,
SelectableMaintainerView,
SuggestionListView,
TriageView,
)
Expand Down Expand Up @@ -50,6 +51,12 @@
),
name="suggestions_view",
),
# This is a POST endpoint only, handling maintainers edit requests.
path(
"edit_maintainers/",
SelectableMaintainerView.as_view(),
name="edit_maintainers",
),
path(
"dismissed/",
SuggestionListView.as_view(
Expand Down
Loading