mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 15:50:03 +01:00 
			
		
		
		
	Compare commits
	
		
			24 Commits
		
	
	
		
			9f8c4725ee
			...
			potvieux
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 9dc11aa016 | ||
|  | ff4353d344 | ||
|  | a90f45bd8b | ||
|  | 10c22ccc53 | ||
|  | 6969cee0f3 | ||
|  | ddeada200b | ||
|  | 84e9fea15f | ||
|  | b9ebb1718a | ||
|  | 2ec5a0d9ca | ||
|  | 3faf611816 | ||
|  | 2807b6ef44 | ||
|  | d6645900d3 | ||
|  | e35847ebd8 | ||
|  | 57268bc9c2 | ||
|  | ab6c943126 | ||
|  | 5dc5f56ae4 | ||
|  | 81017fc393 | ||
|  | 90e3871934 | ||
|  | 95e07f3148 | ||
|  | 770c748bd9 | ||
|  | 06fa096405 | ||
|  | 182f680507 | ||
|  | 5ceda66ded | ||
|  | 6443d64b69 | 
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -48,6 +48,7 @@ backups/ | |||||||
| env/ | env/ | ||||||
| venv/ | venv/ | ||||||
| db.sqlite3 | db.sqlite3 | ||||||
|  | shell.nix | ||||||
|  |  | ||||||
| # ansibles customs host | # ansibles customs host | ||||||
| ansible/host_vars/*.yaml | ansible/host_vars/*.yaml | ||||||
|   | |||||||
| @@ -201,7 +201,8 @@ class Entry(models.Model): | |||||||
|     def save(self, *args, **kwargs): |     def save(self, *args, **kwargs): | ||||||
|         qs = Entry.objects.filter(~Q(pk=self.pk), activity=self.activity, note=self.note, guest=self.guest) |         qs = Entry.objects.filter(~Q(pk=self.pk), activity=self.activity, note=self.note, guest=self.guest) | ||||||
|         if qs.exists(): |         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: |         if self.guest: | ||||||
|             self.note = self.guest.inviter |             self.note = self.guest.inviter | ||||||
|   | |||||||
| @@ -1,6 +1,8 @@ | |||||||
| # Copyright (C) 2018-2025 by BDE ENS Paris-Saclay | # Copyright (C) 2018-2025 by BDE ENS Paris-Saclay | ||||||
| # SPDX-License-Identifier: GPL-3.0-or-later | # SPDX-License-Identifier: GPL-3.0-or-later | ||||||
|  |  | ||||||
|  | import datetime | ||||||
|  |  | ||||||
| from django.utils import timezone | from django.utils import timezone | ||||||
| from django.utils.html import escape | from django.utils.html import escape | ||||||
| from django.utils.safestring import mark_safe | from django.utils.safestring import mark_safe | ||||||
| @@ -55,7 +57,7 @@ class GuestTable(tables.Table): | |||||||
|  |  | ||||||
|     def render_entry(self, record): |     def render_entry(self, record): | ||||||
|         if record.has_entry: |         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)"> ' |         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())) |                          '{delete_trans}</button>'.format(id=record.id, delete_trans=_("remove").capitalize())) | ||||||
|  |  | ||||||
| @@ -77,6 +79,9 @@ def get_row_class(record): | |||||||
|             c += " table-info" |             c += " table-info" | ||||||
|         elif record.note.balance < 0: |         elif record.note.balance < 0: | ||||||
|             c += " table-danger" |             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 |     return c | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -264,13 +264,22 @@ class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView): | |||||||
|                                          balance=F("note__balance")) |                                          balance=F("note__balance")) | ||||||
|  |  | ||||||
|         # Keep only users that have a note |         # 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') | ||||||
|  |  | ||||||
|         # Keep only valid members |         if activity.activity_type.name != "Pot Vieux": | ||||||
|  |             # Keep only members | ||||||
|             note_qs = note_qs.filter( |             note_qs = note_qs.filter( | ||||||
|                 note__noteuser__user__memberships__club=activity.attendees_club, |                 note__noteuser__user__memberships__club=activity.attendees_club, | ||||||
|                 note__noteuser__user__memberships__date_start__lte=timezone.now(), |                 note__noteuser__user__memberships__date_start__lte=timezone.now(), | ||||||
|             note__noteuser__user__memberships__date_end__gte=timezone.now()).exclude(note__inactivity_reason='forced') |                 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(), | ||||||
|  | #       ) | ||||||
|  |  | ||||||
|         # Filter with permission backend |         # Filter with permission backend | ||||||
|         note_qs = note_qs.filter(PermissionBackend.filter_queryset(self.request, Alias, "view")) |         note_qs = note_qs.filter(PermissionBackend.filter_queryset(self.request, Alias, "view")) | ||||||
|   | |||||||
| @@ -3815,7 +3815,7 @@ | |||||||
|             "mask": 2, |             "mask": 2, | ||||||
|             "field": "", |             "field": "", | ||||||
|             "permanent": false, |             "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" | ||||||
| 	} | 	} | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
| @@ -4812,8 +4812,10 @@ | |||||||
|                 168, |                 168, | ||||||
|                 176, |                 176, | ||||||
|                 177, |                 177, | ||||||
|  | 		178, | ||||||
|                 197, |                 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( |     bde = models.CharField( | ||||||
|         max_length=32, |         max_length=32, | ||||||
|         default='RavePartlist', |         default='Diolistos', | ||||||
|         choices=( |         choices=( | ||||||
|  |             ('Diolistos', 'Diol[list]os'), | ||||||
|             ('RavePartlist', 'RavePart[list]'), |             ('RavePartlist', 'RavePart[list]'), | ||||||
|             ('SecretStorlist', 'SecretStor[list]'), |             ('SecretStorlist', 'SecretStor[list]'), | ||||||
|             ('TotalistSpies', 'Tota[list]Spies'), |             ('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 | 
							
								
								
									
										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 */ | /* Make navbar more readable */ | ||||||
| .navbar-dark .navbar-nav .nav-link { | .navbar-dark .navbar-nav .nav-link { | ||||||
|     color: rgba(255, 255, 255, .75); |     color: rgba(255, 255, 255, .75); | ||||||
|     text-shadow: 2px 2px 15px #ffeb40; |     /* text-shadow: 2px 2px 15px #ffeb40; */ | ||||||
| } | } | ||||||
|  |  | ||||||
| .navbar-brand { | /* .navbar-brand { */ | ||||||
|     text-shadow: 2px 2px 15px #ffeb40; | /*     text-shadow: 2px 2px 15px #ffeb40; */ | ||||||
| } | /* } | ||||||
|  |  | ||||||
| /* Last BDE colors */ | /* Last BDE colors */ | ||||||
| .bg-primary { | .bg-primary { | ||||||
| /*    background-color: rgb(18, 67, 4) !important; */ |     background-color: rgb(102, 83, 105) !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 { | html { | ||||||
| @@ -89,94 +85,52 @@ body { | |||||||
| .btn-outline-primary:hover, | .btn-outline-primary:hover, | ||||||
| .btn-outline-primary:not(:disabled):not(.disabled).active, | .btn-outline-primary:not(:disabled):not(.disabled).active, | ||||||
| .btn-outline-primary:not(:disabled):not(.disabled):active { | .btn-outline-primary:not(:disabled):not(.disabled):active { | ||||||
|     color:  rgb(0, 0, 0); |     color: #fff; | ||||||
|     background-color: rgb(255, 0, 101); |     background-color: rgb(102, 83, 105); | ||||||
|     border-color: rgb(255, 203, 32); |     border-color: rgb(102, 83, 105); | ||||||
| } | } | ||||||
|  |  | ||||||
| .btn-outline-primary { | .btn-outline-primary { | ||||||
|     color: #000; |     color: rgb(102, 83, 105); | ||||||
|     background-color: #ffcb20; |     background-color: rgba(248, 249, 250, 0.9); | ||||||
|     border-color: #000; |     border-color: rgb(102, 83, 105); | ||||||
| } | } | ||||||
|  |  | ||||||
| .turbolinks-progress-bar { | .turbolinks-progress-bar { | ||||||
|     background-color: #ffffff; |     background-color: #12432E; | ||||||
| } | } | ||||||
|  |  | ||||||
| .btn-primary:hover, | .btn-primary:hover, | ||||||
| .btn-primary:not(:disabled):not(.disabled).active, | .btn-primary:not(:disabled):not(.disabled).active, | ||||||
| .btn-primary:not(:disabled):not(.disabled):active { | .btn-primary:not(:disabled):not(.disabled):active { | ||||||
|     color:  rgb(0, 0, 0); |     color: #fff; | ||||||
|     background-color: rgb(255, 0, 101); |     background-color: rgb(102, 83, 105); | ||||||
|     border-color: rgb(255, 203, 32); |     border-color: rgb(102, 83, 105); | ||||||
| } | } | ||||||
|  |  | ||||||
| .btn-primary { | .btn-primary { | ||||||
|     color:  #ffcb20;  |     color: rgba(248, 249, 250, 0.9);  | ||||||
|     background-color: #000000; |     background-color: rgb(102, 83, 105); | ||||||
|     border-color: #ffcd20; |     border-color: rgb(102, 83, 105); | ||||||
| } | } | ||||||
|  |  | ||||||
| .border-primary { | .border-primary { | ||||||
|     border-color: rgb(255, 255, 255) !important;  |     border-color: rgb(115, 15, 115) !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 { | a { | ||||||
|     color: rgb(255, 0, 101); |     color: rgb(102, 83, 105); | ||||||
| } | } | ||||||
|  |  | ||||||
| a:hover { | a:hover { | ||||||
|     color: rgb(255, 203, 32); |     color: rgb(200, 30, 200); | ||||||
| } | } | ||||||
|  |  | ||||||
| .form-control:focus { | .form-control:focus { | ||||||
|     box-shadow: 0 0 0 0.25rem rgb(255 0 101 / 50%); |     box-shadow: 0 0 0 0.25rem rgba(200, 30, 200, 0.25); | ||||||
|     border-color: rgb(255, 0, 101); |     border-color: rgb(200, 30, 200); | ||||||
| } | } | ||||||
|  |  | ||||||
| .btn-outline-primary.focus { | .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 '' } |   if (!note) { return '' } | ||||||
|   const balance = note.balance |   const balance = note.balance | ||||||
|   var css = '' |   var css = '' | ||||||
|  |   var ms_per_year = 31536000000 // 365 * 24 * 3600 * 1000 | ||||||
|   if (balance < -2000) { css += ' text-danger bg-dark' }  |   if (balance < -2000) { css += ' text-danger bg-dark' }  | ||||||
|   else if (balance < -1000) { css += ' text-danger' }  |   else if (balance < -1000) { css += ' text-danger' }  | ||||||
|   else if (balance < 0) { css += ' text-warning' } |   else if (balance < 0) { css += ' text-warning' } | ||||||
|   if (!note.email_confirmed) { css += ' bg-primary' } |   if (!note.email_confirmed) { css += ' bg-primary' } | ||||||
|   else if (!note.is_active || (note.membership && note.membership.date_end < new Date().toISOString())) { css += ' bg-info' } |   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 |   return css | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -165,6 +165,11 @@ SPDX-License-Identifier: GPL-3.0-or-later | |||||||
|     </nav> |     </nav> | ||||||
|     <div class="{% block containertype %}container{% endblock %} my-3"> |     <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 user.is_authenticated %} | ||||||
|                 {% if not user|is_member:"BDE" %} |                 {% if not user|is_member:"BDE" %} | ||||||
|                     <div class="alert alert-danger"> |                     <div class="alert alert-danger"> | ||||||
|   | |||||||
| @@ -1,34 +0,0 @@ | |||||||
| # 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
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								shell.nix
									
									
									
									
									
								
							| @@ -1,23 +0,0 @@ | |||||||
| # 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