mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 07:49:57 +01:00 
			
		
		
		
	Compare commits
	
		
			31 Commits
		
	
	
		
			5b717c9892
			...
			potvieux
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 9dc11aa016 | ||
|  | ff4353d344 | ||
|  | a90f45bd8b | ||
|  | 10c22ccc53 | ||
|  | 6969cee0f3 | ||
|  | ddeada200b | ||
|  | 8e2b24b2da | ||
|  | bd76c280ec | ||
|  | ca0a95ba9e | ||
|  | 614f76e699 | ||
|  | a5815f0bc7 | ||
|  | 84e9fea15f | ||
|  | b7a660ee40 | ||
|  | b9ebb1718a | ||
|  | 93aed87265 | ||
|  | 2ec5a0d9ca | ||
|  | 3faf611816 | ||
|  | 2807b6ef44 | ||
|  | d6645900d3 | ||
|  | e35847ebd8 | ||
|  | 57268bc9c2 | ||
|  | ab6c943126 | ||
|  | 5dc5f56ae4 | ||
|  | 81017fc393 | ||
|  | 90e3871934 | ||
|  | 95e07f3148 | ||
|  | 770c748bd9 | ||
|  | 06fa096405 | ||
|  | 182f680507 | ||
|  | 5ceda66ded | ||
|  | 6443d64b69 | 
| @@ -201,7 +201,8 @@ class Entry(models.Model): | ||||
|     def save(self, *args, **kwargs): | ||||
|         qs = Entry.objects.filter(~Q(pk=self.pk), activity=self.activity, note=self.note, guest=self.guest) | ||||
|         if qs.exists(): | ||||
|             raise ValidationError(_("Already entered on ") + _("{:%Y-%m-%d %H:%M:%S}").format(qs.get().time, )) | ||||
|             raise ValidationError(_("Already entered on ") | ||||
|                                   + _("{:%Y-%m-%d %H:%M:%S}").format(timezone.localtime(qs.get().time), )) | ||||
|  | ||||
|         if self.guest: | ||||
|             self.note = self.guest.inviter | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| # Copyright (C) 2018-2025 by BDE ENS Paris-Saclay | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| import datetime | ||||
|  | ||||
| from django.utils import timezone | ||||
| from django.utils.html import escape | ||||
| from django.utils.safestring import mark_safe | ||||
| @@ -55,7 +57,7 @@ class GuestTable(tables.Table): | ||||
|  | ||||
|     def render_entry(self, record): | ||||
|         if record.has_entry: | ||||
|             return str(_("Entered on ") + str(_("{:%Y-%m-%d %H:%M:%S}").format(record.entry.time, ))) | ||||
|             return str(_("Entered on ") + str(_("{:%Y-%m-%d %H:%M:%S}").format(timezone.localtime(record.entry.time)))) | ||||
|         return mark_safe('<button id="{id}" class="btn btn-danger btn-sm" onclick="remove_guest(this.id)"> ' | ||||
|                          '{delete_trans}</button>'.format(id=record.id, delete_trans=_("remove").capitalize())) | ||||
|  | ||||
| @@ -77,6 +79,9 @@ def get_row_class(record): | ||||
|             c += " table-info" | ||||
|         elif record.note.balance < 0: | ||||
|             c += " table-danger" | ||||
|         # MODE VIEUXCON=ON | ||||
|         if (datetime.datetime.utcnow().timestamp() - record.note.created_at.timestamp()) > 3600 * 24 * 365 * 2.5: | ||||
|             c += " font-weight-bold underline" | ||||
|     return c | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -264,13 +264,22 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView): | ||||
|                                          balance=F("note__balance")) | ||||
|  | ||||
|         # Keep only users that have a note | ||||
|         note_qs = note_qs.filter(note__noteuser__isnull=False) | ||||
|         note_qs = note_qs.filter(note__noteuser__isnull=False).exclude(note__inactivity_reason='forced') | ||||
|  | ||||
|         if activity.activity_type.name != "Pot Vieux": | ||||
|             # Keep only members | ||||
|             note_qs = note_qs.filter( | ||||
|                 note__noteuser__user__memberships__club=activity.attendees_club, | ||||
|                 note__noteuser__user__memberships__date_start__lte=timezone.now(), | ||||
|                 note__noteuser__user__memberships__date_end__gte=timezone.now(), | ||||
|             ) | ||||
|  | ||||
|         # Keep only valid members | ||||
|         note_qs = note_qs.filter( | ||||
|             note__noteuser__user__memberships__club=activity.attendees_club, | ||||
|             note__noteuser__user__memberships__date_start__lte=timezone.now(), | ||||
|             note__noteuser__user__memberships__date_end__gte=timezone.now()).exclude(note__inactivity_reason='forced') | ||||
| #        note_qs = note_qs.filter( | ||||
| #            note__noteuser__user__memberships__club=activity.attendees_club, | ||||
| #            note__noteuser__user__memberships__date_start__lte=timezone.now(), | ||||
| #            note__noteuser__user__memberships__date_end__gte=timezone.now(), | ||||
| #       ) | ||||
|  | ||||
|         # Filter with permission backend | ||||
|         note_qs = note_qs.filter(PermissionBackend.filter_queryset(self.request, Alias, "view")) | ||||
|   | ||||
| @@ -23,7 +23,7 @@ from .models import Profile, Club, Membership | ||||
| class CustomAuthenticationForm(AuthenticationForm): | ||||
|     permission_mask = forms.ModelChoiceField( | ||||
|         label=_("Permission mask"), | ||||
|         queryset=PermissionMask.objects.order_by("rank"), | ||||
|         queryset=PermissionMask.objects.order_by("-rank"), | ||||
|         empty_label=None, | ||||
|     ) | ||||
|  | ||||
|   | ||||
| @@ -20,12 +20,14 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
|       </form> | ||||
|     </div> | ||||
|     <!-- MODAL TO CROP THE IMAGE --> | ||||
|     <div class="modal fade" id="modalCrop"> | ||||
|     <div class="modal fade" id="modalCrop" data-backdrop="static"> | ||||
|       <div class="modal-dialog"> | ||||
|         <div class="modal-content"> | ||||
|           <div class="modal-body"> | ||||
|             <img src="" id="modal-image" style="max-width: 100%;"> | ||||
|           </div> | ||||
|             <div class="modal-body-wrapper" style="width: 500px; height: 500px; padding: 16px;"> | ||||
|               <div class="modal-body" style="width: 100%; height: 100%; padding: 0"> | ||||
|                 <img src="" id="modal-image" style="display: block; max-width: 100%;"> | ||||
|               </div> | ||||
|             </div> | ||||
|           <div class="modal-footer"> | ||||
|             <div class="btn-group pull-left" role="group"> | ||||
|               <button type="button" class="btn btn-default" id="js-zoom-in"> | ||||
|   | ||||
| @@ -89,7 +89,7 @@ SPDX-License-Identifier: GPL-2.0-or-later | ||||
|                 </ul> | ||||
|                 <div class="card-body"> | ||||
|                     <select id="debit_type" class="form-control custom-select d-none"> | ||||
|                         {% for special_type in special_types %} | ||||
|                         {% for special_type in special_types|slice:"::-1" %} | ||||
|                             <option value="{{ special_type.id }}">{{ special_type.special_type }}</option> | ||||
|                         {% endfor %} | ||||
|                     </select> | ||||
|   | ||||
| @@ -3815,8 +3815,8 @@ | ||||
|             "mask": 2, | ||||
|             "field": "", | ||||
|             "permanent": false, | ||||
|             "description": "Créer une transaction vers la note d'un club tant que la source reste au dessus de -20 €" | ||||
|         } | ||||
|             "description": "Créer une transaction vers la note d'un club" | ||||
| 	} | ||||
|     }, | ||||
|     { | ||||
|         "model": "permission.permission", | ||||
| @@ -4812,8 +4812,10 @@ | ||||
|                 168, | ||||
|                 176, | ||||
|                 177, | ||||
| 		178, | ||||
|                 197, | ||||
|                 211 | ||||
|                 211, | ||||
| 		244 | ||||
|             ] | ||||
|         } | ||||
|     }, | ||||
|   | ||||
							
								
								
									
										18
									
								
								apps/treasury/migrations/0010_alter_invoice_bde.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								apps/treasury/migrations/0010_alter_invoice_bde.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| # Generated by Django 4.2.20 on 2025-04-14 20:21 | ||||
|  | ||||
| from django.db import migrations, models | ||||
|  | ||||
|  | ||||
| class Migration(migrations.Migration): | ||||
|  | ||||
|     dependencies = [ | ||||
|         ('treasury', '0009_alter_sogecredit_transactions'), | ||||
|     ] | ||||
|  | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name='invoice', | ||||
|             name='bde', | ||||
|             field=models.CharField(choices=[('Diolistos', 'Diol[list]os'), ('RavePartlist', 'RavePart[list]'), ('SecretStorlist', 'SecretStor[list]'), ('TotalistSpies', 'Tota[list]Spies'), ('Saperlistpopette', 'Saper[list]popette'), ('Finalist', 'Fina[list]'), ('Listorique', '[List]orique'), ('Satellist', 'Satel[list]'), ('Monopolist', 'Monopo[list]'), ('Kataclist', 'Katac[list]')], default='Diolistos', max_length=32, verbose_name='BDE'), | ||||
|         ), | ||||
|     ] | ||||
| @@ -27,8 +27,9 @@ class Invoice(models.Model): | ||||
|  | ||||
|     bde = models.CharField( | ||||
|         max_length=32, | ||||
|         default='RavePartlist', | ||||
|         default='Diolistos', | ||||
|         choices=( | ||||
|             ('Diolistos', 'Diol[list]os'), | ||||
|             ('RavePartlist', 'RavePart[list]'), | ||||
|             ('SecretStorlist', 'SecretStor[list]'), | ||||
|             ('TotalistSpies', 'Tota[list]Spies'), | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								apps/treasury/static/img/Diolistos.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								apps/treasury/static/img/Diolistos.png
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.8 MiB | 
							
								
								
									
										
											BIN
										
									
								
								apps/treasury/static/img/Diolistos_bg.jpg
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								apps/treasury/static/img/Diolistos_bg.jpg
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 284 KiB | 
| @@ -27,5 +27,5 @@ MAILTO=notekfet2020@lists.crans.org | ||||
| # Vider les tokens Oauth2 | ||||
|  00  6     *   *   *     root   cd /var/www/note_kfet && env/bin/python manage.py cleartokens -v 0 | ||||
| # Envoyer la liste des abonnés à la NL BDA | ||||
|  00  10     *   *   0     root   cd /var/www/note_kfet && env/bin/python manage.py extract_ml_registrations -t art | ||||
|  00  10     *   *   0     root   cd /var/www/note_kfet && env/bin/python manage.py extract_ml_registrations -t art -e "bda.ensparissaclay@gmail.com" | ||||
|   | ||||
							
								
								
									
										96
									
								
								note_kfet/static/css/custom.css
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										96
									
								
								note_kfet/static/css/custom.css
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -61,20 +61,16 @@ mark { | ||||
| /* Make navbar more readable */ | ||||
| .navbar-dark .navbar-nav .nav-link { | ||||
|     color: rgba(255, 255, 255, .75); | ||||
|     text-shadow: 2px 2px 15px #ffeb40; | ||||
|     /* text-shadow: 2px 2px 15px #ffeb40; */ | ||||
| } | ||||
|  | ||||
| .navbar-brand { | ||||
|     text-shadow: 2px 2px 15px #ffeb40; | ||||
| } | ||||
| /* .navbar-brand { */ | ||||
| /*     text-shadow: 2px 2px 15px #ffeb40; */ | ||||
| /* } | ||||
|  | ||||
| /* Last BDE colors */ | ||||
| .bg-primary { | ||||
| /*    background-color: rgb(18, 67, 4) !important; */ | ||||
| /* MODE VIEUXCON=ON */ | ||||
| /*    background-color: rgb(166, 0, 2) !important; */ | ||||
|     background-color: rgb(0, 0, 0); | ||||
|     background-image: url('/static/img/rp_bg.png'); | ||||
|     background-color: rgb(102, 83, 105) !important; | ||||
| } | ||||
|  | ||||
| html { | ||||
| @@ -89,94 +85,52 @@ body { | ||||
| .btn-outline-primary:hover, | ||||
| .btn-outline-primary:not(:disabled):not(.disabled).active, | ||||
| .btn-outline-primary:not(:disabled):not(.disabled):active { | ||||
|     color:  rgb(0, 0, 0); | ||||
|     background-color: rgb(255, 0, 101); | ||||
|     border-color: rgb(255, 203, 32); | ||||
|     color: #fff; | ||||
|     background-color: rgb(102, 83, 105); | ||||
|     border-color: rgb(102, 83, 105); | ||||
| } | ||||
|  | ||||
| .btn-outline-primary { | ||||
|     color: #000; | ||||
|     background-color: #ffcb20; | ||||
|     border-color: #000; | ||||
|     color: rgb(102, 83, 105); | ||||
|     background-color: rgba(248, 249, 250, 0.9); | ||||
|     border-color: rgb(102, 83, 105); | ||||
| } | ||||
|  | ||||
| .turbolinks-progress-bar { | ||||
|     background-color: #ffffff; | ||||
|     background-color: #12432E; | ||||
| } | ||||
|  | ||||
| .btn-primary:hover, | ||||
| .btn-primary:not(:disabled):not(.disabled).active, | ||||
| .btn-primary:not(:disabled):not(.disabled):active { | ||||
|     color:  rgb(0, 0, 0); | ||||
|     background-color: rgb(255, 0, 101); | ||||
|     border-color: rgb(255, 203, 32); | ||||
|     color: #fff; | ||||
|     background-color: rgb(102, 83, 105); | ||||
|     border-color: rgb(102, 83, 105); | ||||
| } | ||||
|  | ||||
| .btn-primary { | ||||
|     color:  #ffcb20;  | ||||
|     background-color: #000000; | ||||
|     border-color: #ffcd20; | ||||
|     color: rgba(248, 249, 250, 0.9);  | ||||
|     background-color: rgb(102, 83, 105); | ||||
|     border-color: rgb(102, 83, 105); | ||||
| } | ||||
|  | ||||
| .border-primary { | ||||
|     border-color: rgb(255, 255, 255) !important;  | ||||
| } | ||||
|  | ||||
| .btn-secondary { | ||||
|     color:  #ff0065; | ||||
|     background-color: #000000; | ||||
|     border-color: #ff0065; | ||||
| } | ||||
|  | ||||
| .btn-secondary:hover, | ||||
| .btn-secondary:not(:disabled):not(.disabled).active, | ||||
| .btn-secondary:not(:disabled):not(.disabled):active { | ||||
|     color:  rgb(0, 0, 0); | ||||
|     background-color: rgb(255, 203, 32); | ||||
|     border-color: rgb(255, 0, 101); | ||||
| } | ||||
|  | ||||
| .btn-outline-dark-shiny { | ||||
|     background-color: #222; | ||||
|     border-color: #61605b; | ||||
|     color: rgba(255, 0, 101, 75%); | ||||
| } | ||||
|  | ||||
| .btn-outline-dark-shiny:hover, | ||||
| .btn-outline-dark-shiny:not(:disabled):not(.disabled).active, | ||||
| .btn-outline-dark-shiny:not(:disabled):not(.disabled):active { | ||||
|     color:  rgb(0, 0, 0); | ||||
|     background-color: rgb(255, 203, 32); | ||||
|     border-color: rgb(255, 0, 101); | ||||
| } | ||||
|  | ||||
| .btn-outline-dark { | ||||
|     background-color: #222; | ||||
|     border-color: #61605b; | ||||
|     color: rgba(255, 203, 32, 75%); | ||||
| } | ||||
|  | ||||
| .btn-outline-dark:hover, | ||||
| .btn-outline-dark:not(:disabled):not(.disabled).active, | ||||
| .btn-outline-dark:not(:disabled):not(.disabled):active { | ||||
|     color:  rgb(0, 0, 0); | ||||
|     background-color: rgb(255, 0, 101); | ||||
|     border-color: rgb(255, 203, 32); | ||||
|     border-color: rgb(115, 15, 115) !important;  | ||||
| } | ||||
|  | ||||
| a { | ||||
|     color: rgb(255, 0, 101); | ||||
|     color: rgb(102, 83, 105); | ||||
| } | ||||
|  | ||||
| a:hover { | ||||
|     color: rgb(255, 203, 32); | ||||
|     color: rgb(200, 30, 200); | ||||
| } | ||||
|  | ||||
| .form-control:focus { | ||||
|     box-shadow: 0 0 0 0.25rem rgb(255 0 101 / 50%); | ||||
|     border-color: rgb(255, 0, 101); | ||||
|     box-shadow: 0 0 0 0.25rem rgba(200, 30, 200, 0.25); | ||||
|     border-color: rgb(200, 30, 200); | ||||
| } | ||||
|  | ||||
| .btn-outline-primary.focus { | ||||
|   box-shadow: 0 0 0 0.25rem rgb(255 203 32 / 22%); | ||||
| } | ||||
|   box-shadow: 0 0 0 0.25rem rgba(200, 30, 200, 0.5); | ||||
|  | ||||
|   | ||||
| @@ -96,11 +96,13 @@ function displayStyle (note) { | ||||
|   if (!note) { return '' } | ||||
|   const balance = note.balance | ||||
|   var css = '' | ||||
|   var ms_per_year = 31536000000 // 365 * 24 * 3600 * 1000 | ||||
|   if (balance < -2000) { css += ' text-danger bg-dark' }  | ||||
|   else if (balance < -1000) { css += ' text-danger' }  | ||||
|   else if (balance < 0) { css += ' text-warning' } | ||||
|   if (!note.email_confirmed) { css += ' bg-primary' } | ||||
|   else if (!note.is_active || (note.membership && note.membership.date_end < new Date().toISOString())) { css += ' bg-info' } | ||||
|   if (((Date.now() - Date.parse(note.created_at))/ms_per_year) > 2.5) { css += ' font-weight-bold underline' } | ||||
|   return css | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -164,7 +164,12 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
|         </div> | ||||
|     </nav> | ||||
|     <div class="{% block containertype %}container{% endblock %} my-3"> | ||||
| 	<div id="messages"> | ||||
|         <div id="messages"> | ||||
| 	    {% if user.is_authenticated %} | ||||
| 	    	<div class="alert alert-info"> | ||||
| 		    Bravo pour votre diplomation les survis ! | ||||
| 		</div> | ||||
| 	    {% endif %} | ||||
|             {% if user.is_authenticated %} | ||||
|                 {% if not user|is_member:"BDE" %} | ||||
|                     <div class="alert alert-danger"> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user