mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 09:12:11 +01:00 
			
		
		
		
	🐛 Better entry page
This commit is contained in:
		@@ -114,28 +114,31 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView):
 | 
				
			|||||||
        context = super().get_context_data(**kwargs)
 | 
					        context = super().get_context_data(**kwargs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        activity = Activity.objects.filter(PermissionBackend.filter_queryset(self.request.user, Activity, "view"))\
 | 
					        activity = Activity.objects.filter(PermissionBackend.filter_queryset(self.request.user, Activity, "view"))\
 | 
				
			||||||
            .get(pk=self.kwargs["pk"])
 | 
					            .distinct().get(pk=self.kwargs["pk"])
 | 
				
			||||||
        context["activity"] = activity
 | 
					        context["activity"] = activity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        matched = []
 | 
					        matched = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        pattern = "^$"
 | 
					 | 
				
			||||||
        if "search" in self.request.GET:
 | 
					 | 
				
			||||||
            pattern = self.request.GET["search"]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if not pattern:
 | 
					 | 
				
			||||||
            pattern = "^$"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if pattern[0] != "^":
 | 
					 | 
				
			||||||
            pattern = "^" + pattern
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        guest_qs = Guest.objects\
 | 
					        guest_qs = Guest.objects\
 | 
				
			||||||
            .annotate(balance=F("inviter__balance"), note_name=F("inviter__user__username"))\
 | 
					            .annotate(balance=F("inviter__balance"), note_name=F("inviter__user__username"))\
 | 
				
			||||||
            .filter(Q(first_name__regex=pattern) | Q(last_name__regex=pattern)
 | 
					            .filter(activity=activity)\
 | 
				
			||||||
                    | Q(inviter__alias__name__regex=pattern)
 | 
					 | 
				
			||||||
                    | Q(inviter__alias__normalized_name__regex=Alias.normalize(pattern))) \
 | 
					 | 
				
			||||||
            .filter(PermissionBackend.filter_queryset(self.request.user, Guest, "view"))\
 | 
					            .filter(PermissionBackend.filter_queryset(self.request.user, Guest, "view"))\
 | 
				
			||||||
            .distinct()[:20]
 | 
					            .order_by('last_name', 'first_name').distinct()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if "search" in self.request.GET:
 | 
				
			||||||
 | 
					            pattern = self.request.GET["search"]
 | 
				
			||||||
 | 
					            if pattern[0] != "^":
 | 
				
			||||||
 | 
					                pattern = "^" + pattern
 | 
				
			||||||
 | 
					            guest_qs = guest_qs.filter(
 | 
				
			||||||
 | 
					                Q(first_name__regex=pattern)
 | 
				
			||||||
 | 
					                | Q(last_name__regex=pattern)
 | 
				
			||||||
 | 
					                | Q(inviter__alias__name__regex=pattern)
 | 
				
			||||||
 | 
					                | Q(inviter__alias__normalized_name__regex=Alias.normalize(pattern))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            pattern = None
 | 
				
			||||||
 | 
					            guest_qs = guest_qs.none()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for guest in guest_qs:
 | 
					        for guest in guest_qs:
 | 
				
			||||||
            guest.type = "Invité"
 | 
					            guest.type = "Invité"
 | 
				
			||||||
            matched.append(guest)
 | 
					            matched.append(guest)
 | 
				
			||||||
@@ -145,12 +148,18 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView):
 | 
				
			|||||||
                                         username=F("note__noteuser__user__username"),
 | 
					                                         username=F("note__noteuser__user__username"),
 | 
				
			||||||
                                         note_name=F("name"),
 | 
					                                         note_name=F("name"),
 | 
				
			||||||
                                         balance=F("note__balance"))\
 | 
					                                         balance=F("note__balance"))\
 | 
				
			||||||
            .filter(Q(note__polymorphic_ctype__model="noteuser")
 | 
					            .filter(note__polymorphic_ctype__model="noteuser")\
 | 
				
			||||||
                    & (Q(note__noteuser__user__first_name__regex=pattern)
 | 
					 | 
				
			||||||
                    | Q(note__noteuser__user__last_name__regex=pattern)
 | 
					 | 
				
			||||||
                    | Q(name__regex=pattern)
 | 
					 | 
				
			||||||
                    | Q(normalized_name__regex=Alias.normalize(pattern)))) \
 | 
					 | 
				
			||||||
            .filter(PermissionBackend.filter_queryset(self.request.user, Alias, "view"))
 | 
					            .filter(PermissionBackend.filter_queryset(self.request.user, Alias, "view"))
 | 
				
			||||||
 | 
					        if pattern:
 | 
				
			||||||
 | 
					            note_qs = note_qs.filter(
 | 
				
			||||||
 | 
					                Q(note__noteuser__user__first_name__regex=pattern)
 | 
				
			||||||
 | 
					                | Q(note__noteuser__user__last_name__regex=pattern)
 | 
				
			||||||
 | 
					                | Q(name__regex=pattern)
 | 
				
			||||||
 | 
					                | Q(normalized_name__regex=Alias.normalize(pattern))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            note_qs = note_qs.none()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if settings.DATABASES[note_qs.db]["ENGINE"] == 'django.db.backends.postgresql_psycopg2':
 | 
					        if settings.DATABASES[note_qs.db]["ENGINE"] == 'django.db.backends.postgresql_psycopg2':
 | 
				
			||||||
            note_qs = note_qs.distinct('note__pk')[:20]
 | 
					            note_qs = note_qs.distinct('note__pk')[:20]
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
@@ -158,6 +167,7 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView):
 | 
				
			|||||||
            # have distinct aliases rather than distinct notes with a SQLite DB, but it can fill the result page.
 | 
					            # have distinct aliases rather than distinct notes with a SQLite DB, but it can fill the result page.
 | 
				
			||||||
            # In production mode, please use PostgreSQL.
 | 
					            # In production mode, please use PostgreSQL.
 | 
				
			||||||
            note_qs = note_qs.distinct()[:20]
 | 
					            note_qs = note_qs.distinct()[:20]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for note in note_qs:
 | 
					        for note in note_qs:
 | 
				
			||||||
            note.type = "Adhérent"
 | 
					            note.type = "Adhérent"
 | 
				
			||||||
            note.activity = activity
 | 
					            note.activity = activity
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
from django import forms
 | 
					from django import forms
 | 
				
			||||||
from django.contrib.auth.forms import AuthenticationForm
 | 
					from django.contrib.auth.forms import AuthenticationForm
 | 
				
			||||||
from django.contrib.auth.models import User
 | 
					from django.contrib.auth.models import User
 | 
				
			||||||
 | 
					from django.forms import CheckboxSelectMultiple
 | 
				
			||||||
from django.utils.translation import gettext_lazy as _
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
from note.models import NoteSpecial, Alias
 | 
					from note.models import NoteSpecial, Alias
 | 
				
			||||||
from note_kfet.inputs import Autocomplete, AmountInput, DatePickerInput
 | 
					from note_kfet.inputs import Autocomplete, AmountInput, DatePickerInput
 | 
				
			||||||
@@ -151,6 +152,7 @@ class MembershipRolesForm(forms.ModelForm):
 | 
				
			|||||||
    roles = forms.ModelMultipleChoiceField(
 | 
					    roles = forms.ModelMultipleChoiceField(
 | 
				
			||||||
        queryset=Role.objects.filter(weirole=None).all(),
 | 
					        queryset=Role.objects.filter(weirole=None).all(),
 | 
				
			||||||
        label=_("Roles"),
 | 
					        label=_("Roles"),
 | 
				
			||||||
 | 
					        widget=CheckboxSelectMultiple(),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
from django import forms
 | 
					from django import forms
 | 
				
			||||||
from django.contrib.auth.models import User
 | 
					from django.contrib.auth.models import User
 | 
				
			||||||
from django.db.models import Q
 | 
					from django.db.models import Q
 | 
				
			||||||
 | 
					from django.forms import CheckboxSelectMultiple
 | 
				
			||||||
from django.utils.translation import gettext_lazy as _
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
from note_kfet.inputs import AmountInput, DatePickerInput, Autocomplete, ColorWidget
 | 
					from note_kfet.inputs import AmountInput, DatePickerInput, Autocomplete, ColorWidget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -47,6 +48,7 @@ class WEIChooseBusForm(forms.Form):
 | 
				
			|||||||
        label=_("bus"),
 | 
					        label=_("bus"),
 | 
				
			||||||
        help_text=_("This choice is not definitive. The WEI organizers are free to attribute for you a bus and a team,"
 | 
					        help_text=_("This choice is not definitive. The WEI organizers are free to attribute for you a bus and a team,"
 | 
				
			||||||
                    + " in particular if you are a free eletron."),
 | 
					                    + " in particular if you are a free eletron."),
 | 
				
			||||||
 | 
					        widget=CheckboxSelectMultiple(),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    team = forms.ModelMultipleChoiceField(
 | 
					    team = forms.ModelMultipleChoiceField(
 | 
				
			||||||
@@ -54,17 +56,24 @@ class WEIChooseBusForm(forms.Form):
 | 
				
			|||||||
        label=_("Team"),
 | 
					        label=_("Team"),
 | 
				
			||||||
        required=False,
 | 
					        required=False,
 | 
				
			||||||
        help_text=_("Leave this field empty if you won't be in a team (staff, bus chief, free electron)"),
 | 
					        help_text=_("Leave this field empty if you won't be in a team (staff, bus chief, free electron)"),
 | 
				
			||||||
 | 
					        widget=CheckboxSelectMultiple(),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    roles = forms.ModelMultipleChoiceField(
 | 
					    roles = forms.ModelMultipleChoiceField(
 | 
				
			||||||
        queryset=WEIRole.objects.filter(~Q(name="1A")),
 | 
					        queryset=WEIRole.objects.filter(~Q(name="1A")),
 | 
				
			||||||
        label=_("WEI Roles"),
 | 
					        label=_("WEI Roles"),
 | 
				
			||||||
        help_text=_("Select the roles that you are interested in."),
 | 
					        help_text=_("Select the roles that you are interested in."),
 | 
				
			||||||
 | 
					        initial=WEIRole.objects.filter(name="Adhérent WEI").all(),
 | 
				
			||||||
 | 
					        widget=CheckboxSelectMultiple(),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class WEIMembershipForm(forms.ModelForm):
 | 
					class WEIMembershipForm(forms.ModelForm):
 | 
				
			||||||
    roles = forms.ModelMultipleChoiceField(queryset=WEIRole.objects, label=_("WEI Roles"))
 | 
					    roles = forms.ModelMultipleChoiceField(
 | 
				
			||||||
 | 
					        queryset=WEIRole.objects,
 | 
				
			||||||
 | 
					        label=_("WEI Roles"),
 | 
				
			||||||
 | 
					        widget=CheckboxSelectMultiple(),
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def clean(self):
 | 
					    def clean(self):
 | 
				
			||||||
        cleaned_data = super().clean()
 | 
					        cleaned_data = super().clean()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -527,8 +527,9 @@ class WEIRegister2AView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView):
 | 
				
			|||||||
            context["form"].fields["user"].disabled = True
 | 
					            context["form"].fields["user"].disabled = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        choose_bus_form = WEIChooseBusForm()
 | 
					        choose_bus_form = WEIChooseBusForm()
 | 
				
			||||||
        choose_bus_form.fields["bus"].queryset = Bus.objects.filter(wei=context["club"])
 | 
					        choose_bus_form.fields["bus"].queryset = Bus.objects.filter(wei=context["club"]).order_by('name')
 | 
				
			||||||
        choose_bus_form.fields["team"].queryset = BusTeam.objects.filter(bus__wei=context["club"])
 | 
					        choose_bus_form.fields["team"].queryset = BusTeam.objects.filter(bus__wei=context["club"])\
 | 
				
			||||||
 | 
					            .order_by('bus__name', 'name')
 | 
				
			||||||
        context['membership_form'] = choose_bus_form
 | 
					        context['membership_form'] = choose_bus_form
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,3 +14,29 @@
 | 
				
			|||||||
        <button class="btn btn-primary" type="submit">{% trans "Submit" %}</button>
 | 
					        <button class="btn btn-primary" type="submit">{% trans "Submit" %}</button>
 | 
				
			||||||
    </form>
 | 
					    </form>
 | 
				
			||||||
{% endblock %}
 | 
					{% endblock %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block extrajavascript %}
 | 
				
			||||||
 | 
					    <script>
 | 
				
			||||||
 | 
					    $(document).ready(function() {
 | 
				
			||||||
 | 
					        function refreshTeams() {
 | 
				
			||||||
 | 
					            let buses = [];
 | 
				
			||||||
 | 
					            $("input[name='bus']:checked").each(function(ignored) {
 | 
				
			||||||
 | 
					                buses.push($(this).parent().text().trim());
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            console.log(buses);
 | 
				
			||||||
 | 
					            $("input[name='team']").each(function() {
 | 
				
			||||||
 | 
					                let label = $(this).parent();
 | 
				
			||||||
 | 
					                $(this).parent().addClass('d-none');
 | 
				
			||||||
 | 
					                buses.forEach(function(bus) {
 | 
				
			||||||
 | 
					                    if (label.text().includes(bus))
 | 
				
			||||||
 | 
					                        label.removeClass('d-none');
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $("input[name='bus']").change(refreshTeams);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        refreshTeams();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    </script>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user