mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 15:50:03 +01:00 
			
		
		
		
	Compare commits
	
		
			16 Commits
		
	
	
		
			fix_activi
			...
			3300ca1752
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 3300ca1752 | ||
|  | 0a5368d23f | ||
|  | 26b351a51c | ||
|  | 1836677c47 | ||
|  | e7a98c86f0 | ||
|  | eb5044490b | ||
|  | 983d7ec052 | ||
|  | dc56deaf85 | ||
|  | 694f54e1c4 | ||
|  | e6f3084588 | ||
|  | 145e55da75 | ||
|  | d3ba95cdca | ||
|  | 8ffb0ebb56 | ||
|  | 5038af9e34 | ||
|  | 819b4214c9 | ||
|  | b8a93b0b75 | 
| @@ -38,6 +38,7 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
| </a> | ||||
|  | ||||
| <input id="alias" type="text" class="form-control" placeholder="Nom/note ..."> | ||||
| <button id="trigger" class="btn btn-secondary">Click me !</button> | ||||
|  | ||||
| <hr> | ||||
|  | ||||
| @@ -63,15 +64,46 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
|         refreshBalance(); | ||||
|     } | ||||
|  | ||||
|     function process_qrcode() { | ||||
|         let name = alias_obj.val(); | ||||
|         $.get("/api/note/note?search=" + name + "&format=json").done( | ||||
|             function (res) { | ||||
|                 let note = res.results[0]; | ||||
|                 $.post("/api/activity/entry/?format=json", { | ||||
|                     csrfmiddlewaretoken: CSRF_TOKEN, | ||||
|                     activity: {{ activity.id }}, | ||||
|                     note: note.id, | ||||
|                     guest: null | ||||
|                 }).done(function () { | ||||
|                     addMsg(interpolate(gettext( | ||||
|                         "Entry made for %s whose balance is %s €"), | ||||
|                         [note.name, note.balance / 100]), "success", 4000); | ||||
|                     reloadTable(true); | ||||
|                 }).fail(function (xhr) { | ||||
|                     errMsg(xhr.responseJSON, 4000); | ||||
|                 }); | ||||
|             }).fail(function (xhr) { | ||||
|                 errMsg(xhr.responseJSON, 4000); | ||||
|             }); | ||||
|     } | ||||
|  | ||||
|     alias_obj.keyup(function(event) { | ||||
|         let code = event.originalEvent.keyCode | ||||
|         if (65 <= code <= 122 || code === 13) { | ||||
|             debounce(reloadTable)() | ||||
|         } | ||||
|         if (code === 0) | ||||
|             process_qrcode(); | ||||
|     }); | ||||
|  | ||||
|     $(document).ready(init); | ||||
|  | ||||
|     alias_obj2 = document.getElementById("alias"); | ||||
|     $("#trigger").click(function (e) { | ||||
|         addMsg("Clicked", "success", 1000); | ||||
|         alias_obj.val(alias_obj.val() + "\0"); | ||||
|         alias_obj2.dispatchEvent(new KeyboardEvent('keyup')); | ||||
|     }) | ||||
|     function init() { | ||||
|         $(".table-row").click(function (e) { | ||||
|             let target = e.target.parentElement; | ||||
| @@ -168,4 +200,4 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
|         }); | ||||
|     } | ||||
| </script> | ||||
| {% endblock %} | ||||
| {% endblock %} | ||||
|   | ||||
| @@ -45,7 +45,7 @@ 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. | ||||
|     report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency"), widget=forms.HiddenInput()) | ||||
|     report_frequency = forms.IntegerField(required=False, initial=0, label=_("Report frequency")) | ||||
|  | ||||
|     last_report = forms.DateTimeField(required=False, disabled=True, label=_("Last report date")) | ||||
|  | ||||
|   | ||||
| @@ -60,7 +60,10 @@ | ||||
| {% if user_object.pk == user.pk %} | ||||
|     <div class="text-center"> | ||||
|         <a class="small badge badge-secondary" href="{% url 'member:auth_token' %}"> | ||||
|             <i class="fa fa-cogs"></i>{% trans 'API token' %} | ||||
|             <i class="fa fa-cogs"></i> {% trans 'API token' %} | ||||
|         </a> | ||||
|         <a class="small badge badge-secondary" href="{% url 'member:qr_code' user_object.pk %}"> | ||||
|             <i class="fa fa-qrcode"></i> {% trans 'QR Code' %} | ||||
|         </a> | ||||
|     </div> | ||||
| {% endif %} | ||||
|   | ||||
							
								
								
									
										36
									
								
								apps/member/templates/member/qr_code.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								apps/member/templates/member/qr_code.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| {% extends "base.html" %} | ||||
| {% comment %} | ||||
| SPDX-License-Identifier: GPL-3.0-or-later | ||||
| {% endcomment %} | ||||
| {% load i18n %} | ||||
|  | ||||
| {% block content %} | ||||
| <div class="card bg-light"> | ||||
|   	<h3 class="card-header text-center"> | ||||
| 		{% trans "QR Code for" %} {{ user_object.username }} ({{ user_object.first_name }} {{user_object.last_name }}) | ||||
|   	</h3> | ||||
|   	<div class="text-center" id="qrcode"> | ||||
|   	</div> | ||||
| </div> | ||||
|  | ||||
|  | ||||
| {% endblock %} | ||||
|  | ||||
| {% block extrajavascript %} | ||||
| <script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js" integrity="sha512-CNgIRecGo7nphbeZ04Sc13ka07paqdeTu0WR1IM4kNcpmBAUSHSQX0FslNhTDadL4O5SAGapGt4FodqL8My0mA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> | ||||
| <script> | ||||
| 	var qrc = new QRCode(document.getElementById("qrcode"), { | ||||
| 		text: "{{ user_object.pk }}\0", | ||||
| 		width: 1024, | ||||
| 		height: 1024 | ||||
| 	}); | ||||
| </script> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block extracss %} | ||||
| <style> | ||||
| img { | ||||
|     width: 100% | ||||
| } | ||||
| </style> | ||||
| {% endblock %} | ||||
| @@ -25,4 +25,5 @@ urlpatterns = [ | ||||
|     path('user/<int:pk>/aliases/', views.ProfileAliasView.as_view(), name="user_alias"), | ||||
|     path('user/<int:pk>/trust', views.ProfileTrustView.as_view(), name="user_trust"), | ||||
|     path('manage-auth-token/', views.ManageAuthTokens.as_view(), name='auth_token'), | ||||
|     path('user/<int:pk>/qr_code/', views.QRCodeView.as_view(), name='qr_code'), | ||||
| ] | ||||
|   | ||||
| @@ -26,6 +26,7 @@ from note_kfet.middlewares import _set_current_request | ||||
| from permission.backends import PermissionBackend | ||||
| from permission.models import Role | ||||
| from permission.views import ProtectQuerysetMixin, ProtectedCreateView | ||||
| from django import forms | ||||
|  | ||||
| from .forms import UserForm, ProfileForm, ImageForm, ClubForm, MembershipForm, \ | ||||
|     CustomAuthenticationForm, MembershipRolesForm | ||||
| @@ -72,11 +73,24 @@ class UserUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): | ||||
|         form.fields['email'].required = True | ||||
|         form.fields['email'].help_text = _("This address must be valid.") | ||||
|  | ||||
|         if PermissionBackend.check_perm(self.request, "member.change_profile", context['user_object'].profile): | ||||
|             context['profile_form'] = self.profile_form(instance=context['user_object'].profile, | ||||
|                                                         data=self.request.POST if self.request.POST else None) | ||||
|             if not self.object.profile.report_frequency: | ||||
|                 del context['profile_form'].fields["last_report"] | ||||
|         profile_form = self.profile_form(instance=context['user_object'].profile, | ||||
|                                          data=self.request.POST if self.request.POST else None) | ||||
|  | ||||
|         if not self.object.profile.report_frequency: | ||||
|             del profile_form.fields["last_report"] | ||||
|  | ||||
|         fields_to_check = list(profile_form.fields.keys()) | ||||
|         fields_modifiable = False | ||||
|  | ||||
|         # Delete the fields for which the user does not have the permission to modify | ||||
|         for field_name in fields_to_check: | ||||
|             if not PermissionBackend.check_perm(self.request, f"member.change_profile_{field_name}", context['user_object'].profile): | ||||
|                 profile_form.fields[field_name].widget = forms.HiddenInput() | ||||
|             else: | ||||
|                 fields_modifiable = True | ||||
|  | ||||
|         if fields_modifiable: | ||||
|             context['profile_form'] = profile_form | ||||
|  | ||||
|         return context | ||||
|  | ||||
| @@ -388,6 +402,14 @@ class ManageAuthTokens(LoginRequiredMixin, TemplateView): | ||||
|         context['token'] = Token.objects.get_or_create(user=self.request.user)[0] | ||||
|         return context | ||||
|  | ||||
| class QRCodeView(LoginRequiredMixin, DetailView): | ||||
|     """ | ||||
|     Affiche le QR Code | ||||
|     """ | ||||
|     model = User | ||||
|     context_object_name = "user_object" | ||||
|     template_name = "member/qr_code.html" | ||||
|     extra_context = {"title": _("QR Code")} | ||||
|  | ||||
| # ******************************* # | ||||
| #              CLUB               # | ||||
|   | ||||
| @@ -127,7 +127,7 @@ | ||||
|                 "auth", | ||||
|                 "user" | ||||
|             ], | ||||
|             "query": "{\"pk\": [\"user\", \"pk\"]}", | ||||
|             "query": "[\"AND\", {\"pk\": [\"user\", \"pk\"]}, {\"memberships__club__parent_club__isnull\": true}]", | ||||
|             "type": "change", | ||||
|             "mask": 1, | ||||
|             "field": "last_login", | ||||
| @@ -3832,6 +3832,70 @@ | ||||
|             "description": "Voir les profils des membres du club" | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
|         "model": "permission.permission", | ||||
|         "pk": 244, | ||||
|         "fields": { | ||||
|             "model": [ | ||||
|                 "member", | ||||
|                 "profile" | ||||
|             ], | ||||
|             "query": "{}", | ||||
|             "type": "change", | ||||
|             "mask": 3, | ||||
|             "field": "ml_events_registration", | ||||
|             "permanent": false, | ||||
|             "description": "Modifier l'abonnement à la Newsletter BDE pour n'importe quel profil" | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
|         "model": "permission.permission", | ||||
|         "pk": 245, | ||||
|         "fields": { | ||||
|             "model": [ | ||||
|                 "member", | ||||
|                 "profile" | ||||
|             ], | ||||
|             "query": "{}", | ||||
|             "type": "change", | ||||
|             "mask": 3, | ||||
|             "field": "ml_art_registration", | ||||
|             "permanent": false, | ||||
|             "description": "Modifier l'abonnement à la Newsletter Art pour n'importe quel profil" | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
|         "model": "permission.permission", | ||||
|         "pk": 246, | ||||
|         "fields": { | ||||
|             "model": [ | ||||
|                 "member", | ||||
|                 "profile" | ||||
|             ], | ||||
|             "query": "{}", | ||||
|             "type": "change", | ||||
|             "mask": 3, | ||||
|             "field": "ml_sport_registration", | ||||
|             "permanent": false, | ||||
|             "description": "Modifier l'abonnement à la Newsletter Sport pour n'importe quel profil" | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
|         "model": "permission.permission", | ||||
|         "pk": 247, | ||||
|         "fields": { | ||||
|             "model": [ | ||||
|                 "activity", | ||||
|                 "guest" | ||||
|             ], | ||||
|             "query": "{\"activity__organizer\": [\"club\"]}", | ||||
|             "type": "view", | ||||
|             "mask": 2, | ||||
|             "field": "", | ||||
|             "permanent": false, | ||||
|             "description": "Voir les personnes invitées aux événements organisés par son club" | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
|         "model": "permission.role", | ||||
|         "pk": 1, | ||||
|   | ||||
| @@ -795,11 +795,11 @@ msgstr "Masque de permissions" | ||||
|  | ||||
| #: apps/member/forms.py:46 | ||||
| msgid "Report frequency" | ||||
| msgstr "Fréquence des rapports (en jours)" | ||||
| msgstr "Fréquence des relevés (en jours)" | ||||
|  | ||||
| #: apps/member/forms.py:48 | ||||
| msgid "Last report date" | ||||
| msgstr "Date de dernier rapport" | ||||
| msgstr "Date de dernier relevé" | ||||
|  | ||||
| #: apps/member/forms.py:52 | ||||
| msgid "" | ||||
| @@ -1045,11 +1045,11 @@ msgstr "" | ||||
|  | ||||
| #: apps/member/models.py:117 | ||||
| msgid "report frequency (in days)" | ||||
| msgstr "fréquence des rapports (en jours)" | ||||
| msgstr "fréquence des relevés (en jours)" | ||||
|  | ||||
| #: apps/member/models.py:122 | ||||
| msgid "last report date" | ||||
| msgstr "date de dernier rapport" | ||||
| msgstr "date de dernier relevé" | ||||
|  | ||||
| #: apps/member/models.py:127 | ||||
| msgid "email confirmed" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user