mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-30 23:39:54 +01:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			potvieux
			...
			9f8c4725ee
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 9f8c4725ee | ||
|  | dde1baa25c | ||
|  | 7a7ee47e0b | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -48,7 +48,6 @@ backups/ | ||||
| env/ | ||||
| venv/ | ||||
| db.sqlite3 | ||||
| shell.nix | ||||
|  | ||||
| # ansibles customs host | ||||
| ansible/host_vars/*.yaml | ||||
|   | ||||
| @@ -201,8 +201,7 @@ 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(timezone.localtime(qs.get().time), )) | ||||
|             raise ValidationError(_("Already entered on ") + _("{:%Y-%m-%d %H:%M:%S}").format(qs.get().time, )) | ||||
|  | ||||
|         if self.guest: | ||||
|             self.note = self.guest.inviter | ||||
|   | ||||
| @@ -1,8 +1,6 @@ | ||||
| # 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 | ||||
| @@ -57,7 +55,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(timezone.localtime(record.entry.time)))) | ||||
|             return str(_("Entered on ") + str(_("{:%Y-%m-%d %H:%M:%S}").format(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())) | ||||
|  | ||||
| @@ -79,9 +77,6 @@ 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,22 +264,13 @@ 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).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(), | ||||
|             ) | ||||
|         note_qs = note_qs.filter(note__noteuser__isnull=False) | ||||
|  | ||||
|         # 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(), | ||||
| #       ) | ||||
|         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') | ||||
|  | ||||
|         # Filter with permission backend | ||||
|         note_qs = note_qs.filter(PermissionBackend.filter_queryset(self.request, Alias, "view")) | ||||
|   | ||||
| @@ -3815,8 +3815,8 @@ | ||||
|             "mask": 2, | ||||
|             "field": "", | ||||
|             "permanent": false, | ||||
|             "description": "Créer une transaction vers la note d'un club" | ||||
| 	} | ||||
|             "description": "Créer une transaction vers la note d'un club tant que la source reste au dessus de -20 €" | ||||
|         } | ||||
|     }, | ||||
|     { | ||||
|         "model": "permission.permission", | ||||
| @@ -4812,10 +4812,8 @@ | ||||
|                 168, | ||||
|                 176, | ||||
|                 177, | ||||
| 		178, | ||||
|                 197, | ||||
|                 211, | ||||
| 		244 | ||||
|                 211 | ||||
|             ] | ||||
|         } | ||||
|     }, | ||||
|   | ||||
| @@ -1,18 +0,0 @@ | ||||
| # 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,9 +27,8 @@ class Invoice(models.Model): | ||||
|  | ||||
|     bde = models.CharField( | ||||
|         max_length=32, | ||||
|         default='Diolistos', | ||||
|         default='RavePartlist', | ||||
|         choices=( | ||||
|             ('Diolistos', 'Diol[list]os'), | ||||
|             ('RavePartlist', 'RavePart[list]'), | ||||
|             ('SecretStorlist', 'SecretStor[list]'), | ||||
|             ('TotalistSpies', 'Tota[list]Spies'), | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 2.8 MiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 284 KiB | 
							
								
								
									
										96
									
								
								note_kfet/static/css/custom.css
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										96
									
								
								note_kfet/static/css/custom.css
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -61,16 +61,20 @@ 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(102, 83, 105) !important; | ||||
| /*    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'); | ||||
| } | ||||
|  | ||||
| html { | ||||
| @@ -85,52 +89,94 @@ body { | ||||
| .btn-outline-primary:hover, | ||||
| .btn-outline-primary:not(:disabled):not(.disabled).active, | ||||
| .btn-outline-primary:not(:disabled):not(.disabled):active { | ||||
|     color: #fff; | ||||
|     background-color: rgb(102, 83, 105); | ||||
|     border-color: rgb(102, 83, 105); | ||||
|     color:  rgb(0, 0, 0); | ||||
|     background-color: rgb(255, 0, 101); | ||||
|     border-color: rgb(255, 203, 32); | ||||
| } | ||||
|  | ||||
| .btn-outline-primary { | ||||
|     color: rgb(102, 83, 105); | ||||
|     background-color: rgba(248, 249, 250, 0.9); | ||||
|     border-color: rgb(102, 83, 105); | ||||
|     color: #000; | ||||
|     background-color: #ffcb20; | ||||
|     border-color: #000; | ||||
| } | ||||
|  | ||||
| .turbolinks-progress-bar { | ||||
|     background-color: #12432E; | ||||
|     background-color: #ffffff; | ||||
| } | ||||
|  | ||||
| .btn-primary:hover, | ||||
| .btn-primary:not(:disabled):not(.disabled).active, | ||||
| .btn-primary:not(:disabled):not(.disabled):active { | ||||
|     color: #fff; | ||||
|     background-color: rgb(102, 83, 105); | ||||
|     border-color: rgb(102, 83, 105); | ||||
|     color:  rgb(0, 0, 0); | ||||
|     background-color: rgb(255, 0, 101); | ||||
|     border-color: rgb(255, 203, 32); | ||||
| } | ||||
|  | ||||
| .btn-primary { | ||||
|     color: rgba(248, 249, 250, 0.9);  | ||||
|     background-color: rgb(102, 83, 105); | ||||
|     border-color: rgb(102, 83, 105); | ||||
|     color:  #ffcb20;  | ||||
|     background-color: #000000; | ||||
|     border-color: #ffcd20; | ||||
| } | ||||
|  | ||||
| .border-primary { | ||||
|     border-color: rgb(115, 15, 115) !important;  | ||||
|     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); | ||||
| } | ||||
|  | ||||
| a { | ||||
|     color: rgb(102, 83, 105); | ||||
|     color: rgb(255, 0, 101); | ||||
| } | ||||
|  | ||||
| a:hover { | ||||
|     color: rgb(200, 30, 200); | ||||
|     color: rgb(255, 203, 32); | ||||
| } | ||||
|  | ||||
| .form-control:focus { | ||||
|     box-shadow: 0 0 0 0.25rem rgba(200, 30, 200, 0.25); | ||||
|     border-color: rgb(200, 30, 200); | ||||
|     box-shadow: 0 0 0 0.25rem rgb(255 0 101 / 50%); | ||||
|     border-color: rgb(255, 0, 101); | ||||
| } | ||||
|  | ||||
| .btn-outline-primary.focus { | ||||
|   box-shadow: 0 0 0 0.25rem rgba(200, 30, 200, 0.5); | ||||
|  | ||||
|   box-shadow: 0 0 0 0.25rem rgb(255 203 32 / 22%); | ||||
| } | ||||
|   | ||||
| @@ -96,13 +96,11 @@ 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,12 +164,7 @@ SPDX-License-Identifier: GPL-3.0-or-later | ||||
|         </div> | ||||
|     </nav> | ||||
|     <div class="{% block containertype %}container{% endblock %} my-3"> | ||||
|         <div id="messages"> | ||||
| 	    {% if user.is_authenticated %} | ||||
| 	    	<div class="alert alert-info"> | ||||
| 		    Bravo pour votre diplomation les survis ! | ||||
| 		</div> | ||||
| 	    {% endif %} | ||||
| 	<div id="messages"> | ||||
|             {% if user.is_authenticated %} | ||||
|                 {% if not user|is_member:"BDE" %} | ||||
|                     <div class="alert alert-danger"> | ||||
|   | ||||
							
								
								
									
										34
									
								
								shell-static.nix
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										34
									
								
								shell-static.nix
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| # This is a workaround meant for use with the nix package manager. If you don't know what it is or don't use it, please ignore this file. | ||||
| #  | ||||
| # The nk20 javascript static location are hardcoded for imperative system. | ||||
| # This make ./manage.py collectstatic hard to use with nixos. | ||||
| #  | ||||
| # A workaround is to enter a FHSUserEnv with the static placed under /share/javascript/<static>. | ||||
| # This emulate a debian like system and enable collecting static normally with ./manage.py collectstatics. | ||||
| # The regular shell.nix should be enough for other configurations. | ||||
| # | ||||
| # Warning, you are still supposed to use pip package with a venv ! | ||||
| { pkgs ? import <nixpkgs> {} }: | ||||
| (pkgs.buildFHSUserEnv { | ||||
|   name = "pipzone"; | ||||
|   targetPkgs = pkgs: (with pkgs; | ||||
|   let | ||||
|     fhs-static = stdenv.mkDerivation { | ||||
|       name = "fhs-static"; | ||||
|       buildCommand = '' | ||||
|       mkdir -p $out/share/javascript/bootstrap4 | ||||
|       mkdir -p $out/share/javascript/jquery | ||||
|       ln -s ${python39Packages.xstatic-bootstrap}/lib/python3.9/site-packages/xstatic/pkg/bootstrap/data/* $out/share/javascript/bootstrap4 | ||||
|       ln -s ${python39Packages.xstatic-jquery}/lib/python3.9/site-packages/xstatic/pkg/jquery/data/* $out/share/javascript/jquery | ||||
|     ''; | ||||
|     }; | ||||
|   in [ | ||||
|     fhs-static | ||||
|     python39 | ||||
|     gettext | ||||
|     python39Packages.pip | ||||
|     python39Packages.virtualenv | ||||
|     python39Packages.setuptools | ||||
|   ]); | ||||
|   runScript = "bash"; | ||||
| }).env | ||||
							
								
								
									
										23
									
								
								shell.nix
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										23
									
								
								shell.nix
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| # This is meant for use with the nix package manager. If you don't know what it is or don't use it, please ignore this file. | ||||
| # | ||||
| # This shell.nix contains all dependencies require to create a venv and pip install -r requirements.txt. | ||||
| # | ||||
| # Please check shell-static.nix for running ./manage.py collectstatics. | ||||
| { pkgs ? import <nixpkgs> {} }: | ||||
| pkgs.mkShell { | ||||
|   buildInputs = with pkgs; [ | ||||
|     python39 | ||||
|     python39Packages.pip | ||||
|     python39Packages.setuptools | ||||
|     gettext | ||||
|  | ||||
|   ]; | ||||
|   shellHook = '' | ||||
|     # Tells pip to put packages into $PIP_PREFIX instead of the usual locations. | ||||
|     # See https://pip.pypa.io/en/stable/user_guide/#environment-variables. | ||||
|     export PIP_PREFIX=$(pwd)/_build/pip_packages | ||||
|     export PYTHONPATH="$PIP_PREFIX/${pkgs.python39.sitePackages}:$PYTHONPATH" | ||||
|     export PATH="$PIP_PREFIX/bin:$PATH" | ||||
|     unset SOURCE_DATE_EPOCH | ||||
|   ''; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user