members: add demote to waiter button and confirmation

pull/73/head
Christian Merten 1 year ago
parent d1db0b833f
commit d19da71fef
Signed by: christian.merten
GPG Key ID: D953D69721B948B3

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-11-27 23:16+0100\n" "POT-Creation-Date: 2024-11-30 01:22+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -272,6 +272,10 @@ msgstr "Abrechnung einreichen"
msgid "Invite as user" msgid "Invite as user"
msgstr "Als Kompassbenutzer:in einladen" msgstr "Als Kompassbenutzer:in einladen"
#: templates/admin/members/memberunconfirmedproxy/change_form_object_tools.html:8
msgid "Demote to waiter"
msgstr "Zurück auf die Warteliste setzen"
#: templates/admin/members/memberwaitinglist/change_form_object_tools.html:8 #: templates/admin/members/memberwaitinglist/change_form_object_tools.html:8
#: templates/admin/members/memberwaitinglist/submit_line.html:9 #: templates/admin/members/memberwaitinglist/submit_line.html:9
msgid "Invite to group" msgid "Invite to group"

@ -374,7 +374,11 @@ class MemberAdmin(CommonAdminMixin, admin.ModelAdmin):
name_text_or_link.admin_order_field = 'lastname' name_text_or_link.admin_order_field = 'lastname'
class MemberUnconfirmedAdmin(admin.ModelAdmin): class DemoteToWaiterForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
class MemberUnconfirmedAdmin(CommonAdminMixin, admin.ModelAdmin):
fieldsets = [ fieldsets = [
(None, (None,
{ {
@ -422,7 +426,7 @@ class MemberUnconfirmedAdmin(admin.ModelAdmin):
list_filter = ('group', 'confirmed_mail', 'confirmed_alternative_mail') list_filter = ('group', 'confirmed_mail', 'confirmed_alternative_mail')
readonly_fields = ['confirmed_mail', 'confirmed_alternative_mail', readonly_fields = ['confirmed_mail', 'confirmed_alternative_mail',
'good_conduct_certificate_valid'] 'good_conduct_certificate_valid']
actions = ['request_mail_confirmation', 'confirm', 'demote_to_waiter'] actions = ['request_mail_confirmation', 'confirm', 'demote_to_waiter_action']
inlines = [EmergencyContactInline] inlines = [EmergencyContactInline]
change_form_template = "members/change_member_unconfirmed.html" change_form_template = "members/change_member_unconfirmed.html"
@ -464,22 +468,62 @@ class MemberUnconfirmedAdmin(admin.ModelAdmin):
messages.error(request, _("Failed to confirm some registrations because of unconfirmed email addresses.")) messages.error(request, _("Failed to confirm some registrations because of unconfirmed email addresses."))
confirm.short_description = _('Confirm selected registrations') confirm.short_description = _('Confirm selected registrations')
def get_urls(self):
urls = super().get_urls()
def wrap(view):
def wrapper(*args, **kwargs):
return self.admin_site.admin_view(view)(*args, **kwargs)
wrapper.model_admin = self
return update_wrapper(wrapper, view)
custom_urls = [
path(
"<path:object_id>/demote/",
wrap(self.demote_to_waiter_view),
name="%s_%s_demote" % (self.opts.app_label, self.opts.model_name),
),
]
return custom_urls + urls
def demote_to_waiter_action(self, request, queryset):
return self.demote_to_waiter_view(request, queryset)
demote_to_waiter_action.short_description = _('Demote selected registrations to waiters.')
def demote_to_waiter_view(self, request, object_id):
if type(object_id) == str:
member = MemberUnconfirmedProxy.objects.get(pk=object_id)
queryset = [member]
form = None
else:
queryset = object_id
form = DemoteToWaiterForm(initial={'_selected_action': queryset.values_list('id', flat=True)})
if "apply" in request.POST:
self.demote_to_waiter(request, queryset)
return HttpResponseRedirect(reverse('admin:members_memberunconfirmedproxy_changelist'))
context = dict(self.admin_site.each_context(request),
title=_('Demote member to waiter'),
opts=self.opts,
queryset=queryset,
form=form)
return render(request, 'admin/demote_to_waiter.html', context=context)
def demote_to_waiter(self, request, queryset): def demote_to_waiter(self, request, queryset):
for member in queryset: for member in queryset:
#mem_as_dict = member.__dict__
#del mem_as_dict['_state']
#del mem_as_dict['id']
waiter = MemberWaitingList(prename=member.prename, waiter = MemberWaitingList(prename=member.prename,
lastname=member.lastname, lastname=member.lastname,
email=member.email, email=member.email,
birth_date=member.birth_date, birth_date=member.birth_date,
gender=member.gender,
comments=member.comments, comments=member.comments,
confirmed_mail=member.confirmed_mail, confirmed_mail=member.confirmed_mail,
confirm_mail_key=member.confirm_mail_key) confirm_mail_key=member.confirm_mail_key)
waiter.save() waiter.save()
member.delete() member.delete()
messages.success(request, _("Successfully demoted %(name)s to waiter.") % {'name': waiter.name}) messages.success(request, _("Successfully demoted %(name)s to waiter.") % {'name': waiter.name})
demote_to_waiter.short_description = _('Demote selected registrations to waiters.')
def response_change(self, request, member): def response_change(self, request, member):
if "_confirm" in request.POST: if "_confirm" in request.POST:

File diff suppressed because it is too large Load Diff

@ -0,0 +1,48 @@
{% extends "admin/base_site.html" %}
{% load i18n admin_urls static %}
{% block extrahead %}
{{ block.super }}
{{ media }}
<script src="{% static 'admin/js/cancel.js' %}" async></script>
<script type="text/javascript" src="{% static "admin/js/vendor/jquery/jquery.js" %}"></script>
<script type="text/javascript" src="{% static "admin/js/jquery.init.js" %}"></script>
{% endblock %}
{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} invite-waiter
{% endblock %}
{% block breadcrumbs %}
<div class="breadcrumbs">
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
&rsaquo; <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a>
&rsaquo; <a href="{% url opts|admin_urlname:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>
&rsaquo; {% translate 'Demote to waiter' %}
</div>
{% endblock %}
{% block content %}
<h2>{% translate "Demote to waiter" %}</h2>
<p>
{% trans "Do you want to demote the following unconfirmed registrations to waiters?" %}
</p>
<p>
<ul>
{% for member in queryset %}
<li>
<a href="{% url 'admin:members_memberunconfirmedproxy_change' 3 %}">{{ member }}</a>
</li>
{% endfor %}
</ul>
</p>
<form action="" method="post">
{% csrf_token %}
{% if form %}
{{form}}
{% endif %}
<input type="hidden" name="action" value="demote_to_waiter_action">
<input class="default" style="color: $default-link-color" type="submit" name="apply" value="{% translate 'Demote' %}">
<a href="#" class="button cancel-link">{% translate "Cancel" %}</a>
</form>
{% endblock %}

@ -0,0 +1,13 @@
{% extends "admin/change_form_object_tools.html" %}
{% load i18n admin_urls %}
{% block object-tools-items %}
<li>
{% url opts|admin_urlname:'demote' original.pk|admin_urlquote as demote_url %}
<a class="historylink" href="{% add_preserved_filters demote_url %}">{% trans 'Demote to waiter' %}</a>
</li>
{{block.super}}
{% endblock %}
Loading…
Cancel
Save