diff --git a/aleksis/core/assets/components/generic/ButtonMenu.vue b/aleksis/core/assets/components/generic/ButtonMenu.vue index 84239da5303d36b42a07c06613f0c0ccce7a940a..b105f84a8e1254f90bb1d78a2903c42f60cec29e 100644 --- a/aleksis/core/assets/components/generic/ButtonMenu.vue +++ b/aleksis/core/assets/components/generic/ButtonMenu.vue @@ -1,8 +1,5 @@ <template> - <v-menu - transition="slide-y-transition" - offset-y - > + <v-menu transition="slide-y-transition" offset-y> <template #activator="{ on, attrs }"> <slot name="activator" v-bind="{ on, attrs }"> <v-btn outlined text v-bind="attrs" v-on="on"> @@ -14,7 +11,7 @@ </template> <v-list> - <slot/> + <slot /> </v-list> </v-menu> </template> @@ -27,8 +24,8 @@ export default { type: String, required: false, default: "mdi-dots-horizontal", - } - } + }, + }, }; </script> diff --git a/aleksis/core/templates/core/empty.html b/aleksis/core/templates/core/empty.html new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/aleksis/core/templates/core/person/full.html b/aleksis/core/templates/core/person/full.html deleted file mode 100644 index e6d7226996588b48321c3d9d8a7ad6726afabd72..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/core/person/full.html +++ /dev/null @@ -1,277 +0,0 @@ -{# -*- engine:django -*- #} - -{% extends "core/base.html" %} - -{% load i18n static rules material_form %} -{% load render_table from django_tables2 %} - -{% block browser_title %}{{ person.first_name }} {{ person.last_name }}{% endblock %} -{% block no_page_title%}{% endblock %} - -{% block content %} - - {% has_perm 'core.edit_person_rule' user person as can_change_person %} - {% has_perm 'core.change_person_preferences_rule' user person as can_change_person_preferences %} - {% has_perm 'core.delete_person_rule' user person as can_delete_person %} - {% has_perm "core.impersonate_rule" user person as can_impersonate %} - {% has_perm "core.can_invite_rule" user person as can_invite %} - - {% include "core/partials/hero_background.html" %} - - {% if can_change_person or can_change_person_preferences or can_delete_person or can_impersonate or can_invite %} - <p class="person-buttons hide-on-med-and-down"> - {% if can_change_person %} - <a href="{% url 'edit_person_by_id' person.id %}" class="btn waves-effect waves-light"> - <i class="material-icons left iconify" data-icon="mdi:pencil-outline"></i> - {% trans "Edit" %} - </a> - {% endif %} - - {% if can_delete_person %} - <a href="{% url 'delete_person_by_id' person.id %}" class="btn waves-effect waves-light red"> - <i class="material-icons left iconify" data-icon="mdi:delete-outline"></i> - {% trans "Delete" %} - </a> - {% endif %} - - {% if can_change_person_preferences %} - <a href="{% url 'preferences_person' person.id %}" class="btn waves-effect waves-light"> - <i class="material-icons left iconify" data-icon="mdi:cog-outline"></i> - {% trans "Change preferences" %} - </a> - {% endif %} - - {% if can_impersonate and person.user %} - <a href="{% url 'impersonate-start' person.user.id %}" class="btn waves-effect waves-light"> - <i class="material-icons left iconify" data-icon="mdi:account-box-outline"></i> - {% trans "Impersonate" %} - </a> - {% endif %} - - {% if invite_enabled and can_invite and not person.user %} - <a href="{% url "invite_person_by_id" person.id %}" class="btn waves-effect waves-light"> - <i class="material-icons iconify left" data-icon="mdi:account-plus-outline"></i> - {% trans "Invite user" %} - </a> - {% endif %} - </p> - {% endif %} - - <header class="person-container"> - <div class="image-wrapper"> - {% include "core/partials/avatar_content.html" with class="clip-circle materialboxed z-depth-2" person_or_user=person title=True %} - </div> - <h1> - {{ person.first_name }} {{ person.last_name }} - {% if person.user %} - <small class="grey-text">{{ person.user.username }}</small> - {% endif %} - </h1> - </header> - - <div class="row"> - {% if person.description %} - <div class="col s12"> - <p class="container center-align"> - {{ person.description }} - </p> - </div> - {% endif %} - {% if can_change_person or can_change_person_preferences or can_delete_person or can_impersonate or can_invite %} - <div class="col s12 hide-on-large-only"> - <div class="collection"> - {% if can_change_person %} - <a href="{% url 'edit_person_by_id' person.id %}" class="collection-item waves-effect waves-dark"> - <i class="material-icons iconify left" data-icon="mdi:pencil-outline"></i> - {% trans "Edit" %} - </a> - {% endif %} - - {% if can_delete_person %} - <a href="{% url 'delete_person_by_id' person.id %}" class="collection-item waves-effect waves-red red-text"> - <i class="material-icons iconify left" data-icon="mdi:delete-outline"></i> - {% trans "Delete" %} - </a> - {% endif %} - - {% if can_change_person_preferences %} - <a href="{% url 'preferences_person' person.id %}" class="collection-item waves-effect waves-dark"> - <i class="material-icons iconify left" data-icon="mdi:cog-outline"></i> - {% trans "Change preferences" %} - </a> - {% endif %} - - {% if can_impersonate and person.user %} - <a href="{% url 'impersonate-start' person.user.id %}" class="collection-item waves-effect waves-dark"> - <i class="material-icons iconify left" data-icon="mdi:account-box-outline"></i> - {% trans "Impersonate" %} - </a> - {% endif %} - - {% if can_invite and not person.user %} - <a href="{% url "invite_person_by_id" person.id %}" class="collection-item waves-effect waves-light"> - <i class="material-icons iconify left" data-icon="mdi:account-plus-outline"></i> - {% trans "Invite user" %} - </a> - {% endif %} - </div> - </div> - {% endif %} - <div class="col s12 l4"> - <h2>{% blocktrans %}Contact details{% endblocktrans %}</h2> - <div class="card-panel"> - <table class="highlight"> - <tr> - <td> - <i class="material-icons small iconify" data-icon="mdi:account-outline"></i> - </td> - <td>{{ person.first_name }} {{ person.additional_name }} {{ person.last_name }}</td> - </tr> - <tr> - <td> - <i class="material-icons small iconify" data-icon="mdi:human-non-binary"></i> - </td> - <td>{% firstof person.get_sex_display "–" %}</td> - </tr> - {% has_perm 'core.view_address_rule' user person as can_view_address %} - {% if can_view_address %} - <tr> - <td rowspan="2"> - <i class="material-icons small iconify" data-icon="mdi:map-marker-outline"></i> - </td> - <td>{% firstof person.street "–" %} {{ person.housenumber }}</td> - </tr> - <tr> - <td>{{ person.postal_code }} {% firstof person.place "–" %}</td> - </tr> - {% endif %} - {% has_perm 'core.view_contact_details_rule' user person as can_view_contact_details %} - {% if can_view_contact_details %} - <tr> - <td rowspan="2"> - <i class="material-icons small iconify" data-icon="mdi:phone-outline"></i> - </td> - <td> - {% if person.phone_number %} - <a href="{{ person.phone_number.as_rfc3966 }}">{{ person.phone_number.as_international }}</a> - {% else %} - – - {% endif %} - <small>({% trans "Home phone" %})</small> - </td> - </tr> - <tr> - <td> - {% if person.mobile_number %} - <a href="{{ person.mobile_number.as_rfc3966 }}">{{ person.mobile_number.as_international }}</a> - {% else %} - – - {% endif %} - <small>({% trans "Mobile phone" %})</small> - </td> - </tr> - <tr> - <td> - <i class="material-icons small iconify" data-icon="mdi:email-outline"></i> - </td> - <td> - {% if person.email %} - <a href="mailto:{{ person.email }}">{{ person.email }}</a> - {% else %} - – - {% endif %} - </td> - </tr> - {% endif %} - {% has_perm 'core.view_personal_details_rule' user person as can_view_personal_details %} - {% if can_view_personal_details %} - <tr> - <td> - <i class="material-icons small iconify" data-icon="mdi:cake"></i> - </td> - <td> - <time datetime="{{ person.date_of_birth|date:'c' }}">{{ person.date_of_birth|date }}</time> - {% firstof person.place_of_birth "–" %} - </td> - </tr> - {% endif %} - </table> - </div> - {% has_perm 'core.view_avatar_rule' user person as can_view_avatar %} - {% has_perm 'core.view_photo_rule' user person as can_view_photo %} - {% if person.photo and can_view_photo and not SITE_PREFERENCES.account__person_prefer_photo %} - <div class="card"> - <div class="card-image"> - <img src="{{ person.photo.url }}" alt="{{ person.first_name }} {{ person.last_name }}" class="materialboxed"> - <span class="card-title">{{ person.first_name }} {{ person.last_name }}</span> - </div> - </div> - {% elif person.avatar and can_view_avatar %} - <div class="card"> - <div class="card-image"> - <img src="{{ person.avatar.url }}" - alt="{{ person.first_name }} {{ person.last_name }} ({% trans "Avatar" %})" class="materialboxed"> - <span class="card-title">{{ person.first_name }} {{ person.last_name }} ({% trans "Avatar" %})</span> - </div> - </div> - {% else %} - <div class="card-panel"> - <i class="material-icons iconify left" data-icon="mdi:image-off-outline"></i> - {% trans "This person didn't upload a personal photo." %} - </div> - {% endif %} - </div> - - {% if person.children.all or person.guardians.all and can_view_personal_details %} - <div class="col s12 m6 l4"> - {% if person.children.all and can_view_personal_details %} - <h2>{% trans "Children" %}</h2> - <div class="card-panel"> - {% include "core/person/collection.html" with persons=person.children.all %} - </div> - {% endif %} - - {% if person.guardians.all and can_view_personal_details %} - <h2>{% trans "Guardians / Parents" %}</h2> - <div class="card-panel"> - {% include "core/person/collection.html" with persons=person.guardians.all %} - </div> - {% endif %} - </div> - {% endif %} - - {% has_perm 'core.view_person_groups_rule' user person as can_view_groups %} - {% if can_view_groups %} - <div class="col s12 m6 l4"> - {% if groups.count %} - <div> - <h2>{% blocktrans %}Groups{% endblocktrans %}</h2> - <div class="card-panel"> - <div class="collection"> - {% for group in groups %} - <a href="{{ group.get_absolute_url }}" class="collection-item"> - {{ group.name }} ({{ group.school_term }}) - </a> - {% endfor %} - </div> - </div> - </div> - {% endif %} - {% if person.owner_of_recursive.count %} - <div> - <h2>{% blocktrans %}Group ownership{% endblocktrans %}</h2> - <div class="card-panel"> - <div class="collection"> - {% for group in person.owner_of_recursive.all %} - <a href="{{ group.get_absolute_url }}" class="collection-item"> - {{ group.name }} ({{ group.school_term }}) - </a> - {% endfor %} - </div> - </div> - </div> - {% endif %} - </div> - {% endif %} - </div> -{% endblock %} diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py index c25861a504419b364b6f96d72769d658ed1e01c2..ba242b1604aa9ed2320614894ecfac89677237c8 100644 --- a/aleksis/core/urls.py +++ b/aleksis/core/urls.py @@ -88,7 +88,11 @@ urlpatterns = [ path("persons/", views.persons, name="persons"), path("person/", views.person, name="person"), path("persons/create/", views.CreatePersonView.as_view(), name="create_person"), - path("persons/<int:id_>/", views.person, name="person_by_id"), + path( + "persons/<int:id_>/", + TemplateView.as_view(template_name="core/empty.html"), + name="person_by_id", + ), path( "persons/<int:pk>/edit/", views.EditPersonView.as_view(), diff --git a/aleksis/core/views.py b/aleksis/core/views.py index ede1cd0e41bbc0d84104eaefdbf3e7dbd13f1b1a..28d0bec4bfe509ce7da93935f910fe020c67b062 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -312,26 +312,6 @@ def persons(request: HttpRequest) -> HttpResponse: return render(request, "core/person/list.html", context) -@pwa_cache -@permission_required( - "core.view_person_rule", fn=objectgetter_optional(Person, "request.user.person", True) -) -def person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse: - """Detail view for one person; defaulting to logged-in person.""" - context = {} - - person = objectgetter_optional(Person, "request.user.person", True)(request, id_) - context["person"] = person - - # Get groups where person is member of - context["groups"] = person.member_of.all() - - # Get whether the invitation feature is enabled in the preferences - context["invite_enabled"] = get_site_preferences()["auth__invite_enabled"] - - return render(request, "core/person/full.html", context) - - @pwa_cache @permission_required("core.view_group_rule", fn=objectgetter_optional(Group, None, False)) def group(request: HttpRequest, id_: int) -> HttpResponse: