mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 01:12:08 +01:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			family
			...
			phone_inpu
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					0934b8fa34 | ||
| 
						 | 
					7633c9ab4b | 
@@ -10,6 +10,7 @@ from django.contrib.auth.forms import AuthenticationForm
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
from django.db import transaction
 | 
			
		||||
from django.forms import CheckboxSelectMultiple
 | 
			
		||||
from phonenumber_field.formfields import PhoneNumberField
 | 
			
		||||
from django.utils import timezone
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
from note.models import NoteSpecial, Alias
 | 
			
		||||
@@ -45,6 +46,11 @@ class ProfileForm(forms.ModelForm):
 | 
			
		||||
    A form for the extras field provided by the :model:`member.Profile` model.
 | 
			
		||||
    """
 | 
			
		||||
    # Remove widget=forms.HiddenInput() if you want to use report frequency.
 | 
			
		||||
    phone_number = PhoneNumberField(
 | 
			
		||||
        widget=forms.TextInput(attrs={"type": "tel", "class": "form-control"}),
 | 
			
		||||
        required=False
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency"))
 | 
			
		||||
 | 
			
		||||
    last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date"))
 | 
			
		||||
@@ -72,7 +78,12 @@ class ProfileForm(forms.ModelForm):
 | 
			
		||||
        if not self.instance.section or (("department" in self.changed_data
 | 
			
		||||
                                         or "promotion" in self.changed_data) and "section" not in self.changed_data):
 | 
			
		||||
            self.instance.section = self.instance.section_generated
 | 
			
		||||
        return super().save(commit)
 | 
			
		||||
        instance = super().save(commit=False)
 | 
			
		||||
        if instance.phone_number:
 | 
			
		||||
            instance.phone_number = instance.phone_number.as_e164
 | 
			
		||||
        if commit:
 | 
			
		||||
            instance.save()
 | 
			
		||||
        return instance
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = Profile
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
        {{ title }}
 | 
			
		||||
    </h3>
 | 
			
		||||
    <div class="card-body">
 | 
			
		||||
        <form method="post">
 | 
			
		||||
        <form method="post" id="profile-form">
 | 
			
		||||
            {% csrf_token %}
 | 
			
		||||
            {{ form | crispy }}
 | 
			
		||||
            {{ profile_form | crispy }}
 | 
			
		||||
@@ -21,3 +21,45 @@ SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block extrajavascript %}
 | 
			
		||||
<!-- intl-tel-input CSS/JS -->
 | 
			
		||||
<script>
 | 
			
		||||
(() => {
 | 
			
		||||
    const input = document.querySelector("input[name='phone_number']");
 | 
			
		||||
    const form = document.querySelector("#profile-form");
 | 
			
		||||
 | 
			
		||||
    if (!input || !form) {
 | 
			
		||||
        console.error("Input phone_number ou form introuvable.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const iti = window.intlTelInput(input, {
 | 
			
		||||
        initialCountry: "auto",
 | 
			
		||||
        nationalMode: false,
 | 
			
		||||
        autoPlaceholder: "off",
 | 
			
		||||
        geoIpLookup: callback => {
 | 
			
		||||
            fetch("https://ipapi.co/json")
 | 
			
		||||
                .then(res => res.json())
 | 
			
		||||
                .then(data => callback(data.country_code))
 | 
			
		||||
                .catch(() => callback("fr"));
 | 
			
		||||
        },
 | 
			
		||||
        loadUtils: () => import("https://cdn.jsdelivr.net/npm/intl-tel-input@25.5.2/build/js/utils.js"),
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    form.addEventListener("submit", function(e){
 | 
			
		||||
        if (!input.value.trim()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const number = iti.getNumber(intlTelInput.utils.numberFormat.E164);
 | 
			
		||||
        if (number) {
 | 
			
		||||
            input.value = number;
 | 
			
		||||
            form.submit();
 | 
			
		||||
        } else {
 | 
			
		||||
            e.preventDefault();
 | 
			
		||||
            input.focus();
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
})();
 | 
			
		||||
</script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -11,7 +11,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
        {{ title }}
 | 
			
		||||
    </h3>
 | 
			
		||||
    <div class="card-body">
 | 
			
		||||
        <form method="post">
 | 
			
		||||
        <form id="registration-form" method="post">
 | 
			
		||||
            {% csrf_token %}
 | 
			
		||||
            {{ form|crispy }}
 | 
			
		||||
            {{ membership_form|crispy }}
 | 
			
		||||
@@ -22,6 +22,46 @@ SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block extrajavascript %}
 | 
			
		||||
<!-- intl-tel-input CSS/JS -->
 | 
			
		||||
<script>
 | 
			
		||||
(() => {
 | 
			
		||||
    const input = document.querySelector("input[name='emergency_contact_phone']");
 | 
			
		||||
    const form = document.querySelector("#registration-form");
 | 
			
		||||
 | 
			
		||||
    if (!input || !form) {
 | 
			
		||||
        console.error("Input phone_number ou form introuvable.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const iti = window.intlTelInput(input, {
 | 
			
		||||
        initialCountry: "auto",
 | 
			
		||||
        nationalMode: false,
 | 
			
		||||
        autoPlaceholder: "off",
 | 
			
		||||
        geoIpLookup: callback => {
 | 
			
		||||
            fetch("https://ipapi.co/json")
 | 
			
		||||
                .then(res => res.json())
 | 
			
		||||
                .then(data => callback(data.country_code))
 | 
			
		||||
                .catch(() => callback("fr"));
 | 
			
		||||
        },
 | 
			
		||||
        loadUtils: () => import("https://cdn.jsdelivr.net/npm/intl-tel-input@25.5.2/build/js/utils.js"),
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    form.addEventListener("submit", function(e){
 | 
			
		||||
        if (!input.value.trim()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const number = iti.getNumber(intlTelInput.utils.numberFormat.E164);
 | 
			
		||||
        if (number) {
 | 
			
		||||
            input.value = number;
 | 
			
		||||
            form.submit();
 | 
			
		||||
        } else {
 | 
			
		||||
            e.preventDefault();
 | 
			
		||||
            input.focus();
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
})();
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
{% if not object.membership %}
 | 
			
		||||
<script>
 | 
			
		||||
    $(document).ready(function () {
 | 
			
		||||
 
 | 
			
		||||
@@ -305,8 +305,8 @@ PIC_WIDTH = 200
 | 
			
		||||
PIC_RATIO = 1
 | 
			
		||||
 | 
			
		||||
# Custom phone number format
 | 
			
		||||
PHONENUMBER_DB_FORMAT = 'NATIONAL'
 | 
			
		||||
PHONENUMBER_DEFAULT_REGION = 'FR'
 | 
			
		||||
PHONENUMBER_DB_FORMAT = 'E164'
 | 
			
		||||
PHONENUMBER_DEFAULT_REGION = None
 | 
			
		||||
 | 
			
		||||
# We add custom information to CAS, in order to give a normalized name to other services
 | 
			
		||||
CAS_AUTH_CLASS = 'member.auth.CustomAuthUser'
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
    <link rel="stylesheet" href="{% static "font-awesome/css/font-awesome.min.css" %}">
 | 
			
		||||
    <link rel="stylesheet" href="{% static "css/custom.css" %}">
 | 
			
		||||
    
 | 
			
		||||
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/intl-tel-input@25.5.2/build/css/intlTelInput.css">
 | 
			
		||||
 | 
			
		||||
    {# JQuery, Bootstrap and Turbolinks JavaScript #}
 | 
			
		||||
    <script src="{% static "jquery/jquery.min.js" %}"></script>
 | 
			
		||||
    <script src="{% static "popper.js/umd/popper.min.js" %}"></script>
 | 
			
		||||
@@ -41,6 +43,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
    {# Translation in javascript files #}
 | 
			
		||||
    <script src="{% static "js/jsi18n/"|add:LANGUAGE_CODE|add:".js" %}"></script>
 | 
			
		||||
 | 
			
		||||
    <script src="https://cdn.jsdelivr.net/npm/intl-tel-input@25.5.2/build/js/intlTelInput.min.js"></script>
 | 
			
		||||
    
 | 
			
		||||
    {# If extra ressources are needed for a form, load here #}
 | 
			
		||||
    {% if form.media %}
 | 
			
		||||
        {{ form.media }}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
            {% endblocktrans %}
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <form method="post">
 | 
			
		||||
        <form method="post" id="profile_form">
 | 
			
		||||
            {% csrf_token %}
 | 
			
		||||
            {{ form|crispy }}
 | 
			
		||||
            {{ profile_form|crispy }}
 | 
			
		||||
@@ -31,3 +31,45 @@ SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block extrajavascript %}
 | 
			
		||||
<!-- intl-tel-input CSS/JS -->
 | 
			
		||||
<script>
 | 
			
		||||
(() => {
 | 
			
		||||
    const input = document.querySelector("input[name='phone_number']");
 | 
			
		||||
    const form = document.querySelector("#profile_form");
 | 
			
		||||
 | 
			
		||||
    if (!input || !form) {
 | 
			
		||||
        console.error("Input phone_number ou form introuvable.");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const iti = window.intlTelInput(input, {
 | 
			
		||||
        initialCountry: "auto",
 | 
			
		||||
        nationalMode: false,
 | 
			
		||||
        autoPlaceholder: "off",
 | 
			
		||||
        geoIpLookup: callback => {
 | 
			
		||||
            fetch("https://ipapi.co/json")
 | 
			
		||||
                .then(res => res.json())
 | 
			
		||||
                .then(data => callback(data.country_code))
 | 
			
		||||
                .catch(() => callback("fr"));
 | 
			
		||||
        },
 | 
			
		||||
        loadUtils: () => import("https://cdn.jsdelivr.net/npm/intl-tel-input@25.5.2/build/js/utils.js"),
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    form.addEventListener("submit", function(e){
 | 
			
		||||
        if (!input.value.trim()) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const number = iti.getNumber(intlTelInput.utils.numberFormat.E164);
 | 
			
		||||
        if (number) {
 | 
			
		||||
            input.value = number;
 | 
			
		||||
            form.submit();
 | 
			
		||||
        } else {
 | 
			
		||||
            e.preventDefault();
 | 
			
		||||
            input.focus();
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
})();
 | 
			
		||||
</script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
		Reference in New Issue
	
	Block a user