Skip to content
GitLab
Explore
Sign in
Commits on Source (10)
Move WEI scripts to the scripts app
· 578bd892
ynerant
authored
Apr 23, 2020
578bd892
Update README, fixed make_su script
· 8f2976b4
ynerant
authored
Apr 23, 2020
8f2976b4
Add script to export the WEI registrations as CSV format
· 8b903808
ynerant
authored
Apr 23, 2020
8b903808
Fields were missing in the generated CSV, better to be coherent with the header
· 26be04c4
ynerant
authored
Apr 23, 2020
26be04c4
Order registration by promotion rather than by roles
· 256ac0a7
ynerant
authored
Apr 24, 2020
256ac0a7
Send a mail to webmasters when an error occurs (in production mode)
· e59001b1
ynerant
authored
Apr 25, 2020
e59001b1
Remove debug print line
· 1090fe0b
ynerant
authored
Apr 26, 2020
1090fe0b
Import activities, guests and guest transactions
· 4ce9aa0d
ynerant
authored
Apr 27, 2020
4ce9aa0d
Import memberships
· 60a6b3c7
ynerant
authored
Apr 27, 2020
60a6b3c7
Import remittances
· f0aa4269
ynerant
authored
Apr 27, 2020
f0aa4269
Expand all
Hide whitespace changes
Inline
Side-by-side
README.md
View file @
f0aa4269
...
...
@@ -5,15 +5,59 @@
> les commandes sont documentées:
> `./manage.py command --help`
-
import_nk15 :
Importe un dump de la NoteKfet 2015.
-
`import_nk15`
:
-
make_su:
rend superutilisateur les pseudos renseignés
Importe un dump de la NoteKfet 2015.
-
`make_su [--STAFF|-s] [--SUPER|-S]`
:
Rend actifs les pseudos renseignés.
*
Si
`--STAFF`
ou
`-s`
est renseigné, donne en plus le statut d'équipe aux pseudos renseignés,
permettant l'accès à l'interface admin.
*
Si
`--SUPER`
ou
`-S`
est renseigné, donne en plus le statut de super-utilisateur aux pseudos renseignés,
octroyant tous les droits sur la plateforme.
-
`wei_algorithm`
:
Lance l'algorithme de répartition des 1A au dernier WEI. Cela a pour effet de suggérer un bus pour tous les 1A
inscrits au dernier WEI en fonction des données rentrées dans le sondage, la validation se faisant ensuite
manuellement via l'interface Web.
-
`extract_ml_registrations --type {members, clubs, events, art, sport} [--year|-y YEAR]`
:
Récupère la liste des adresses mail à inscrire à une liste de diffusion donnée.
* `members` : Liste des adresses mail des utilisateurs ayant une adhésion BDE (et non Kfet) active.
* `clubs` : Liste des adresses mail de contact de tous les clubs BDE enregistrés.
* `events` : Liste de toutes les adresses mails des utilisateurs inscrits au WEI ayant demandé à s'inscrire sur
la liste de diffusion des événements du BDE.
* `art` : Liste de toutes les adresses mails des utilisateurs inscrits au WEI ayant demandé à s'inscrire sur
la liste de diffusion concertnant les actualités artistiques du BDA.
* `sport` : Liste de toutes les adresses mails des utilisateurs inscrits au WEI ayant demandé à s'inscrire sur
la liste de diffusion concertnant les actualités sportives du BDS.
Le champ `--year` est optionnel : il permet de choisir l'année du WEI en question (pour les trois dernières
options). Si non renseigné, il s'agit du dernier WEI.
Par défaut, si `--type` est non renseigné, la liste des adhérents BDE est renvoyée.
-
`extract_wei_registrations [--year|-y YEAR] [--bus|-b BUS] [--team|-t TEAM] [--sep SEP]`
:
Récupère la liste des inscriptions au WEI et l'exporte au format CSV. Arguments possibles, optionnels :
* `--year YEAR` : sélectionne l'année du WEI. Par défaut, il s'agit du dernier WEI ayant eu lieu.
* `--bus BUS` : filtre par bus, en récupérant uniquement les inscriptions sur un bus. Par défaut, on affiche
tous les bus.
* `--team TEAM` : filtre par équipe, en récupérant uniquement les inscriptions sur une équipe. Par défaut, on
affiche toutes les équipes. Entrer `"none"` filtre les inscriptions sans équipe (chefs de bus, ...)
* `--sep` : définit le caractère de séparation des colonnes du fichier CSV. Par défaut, il s'agit du caractère `|`.
Merci de ne pas rentrer plus d'un caractère.
## Shell
-
Tabula rasa:
```
sh
-
Tabula rasa
:
```
sh
ell script
sudo -u postgres sh -c "dropdb note_db && psql -c 'CREATE DATABASE note_db OWNER note;'"
```
__init__.py
View file @
f0aa4269
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
default_app_config
=
'
scripts.apps.ScriptsConfig
'
apps.py
0 → 100644
View file @
f0aa4269
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from
django.apps
import
AppConfig
from
django.core.signals
import
got_request_exception
class
ScriptsConfig
(
AppConfig
):
name
=
'
scripts
'
def
ready
(
self
):
from
.
import
signals
got_request_exception
.
connect
(
signals
.
send_mail_on_exception
)
management/commands/export_wei_registrations.py
0 → 100644
View file @
f0aa4269
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from
django.core.management
import
BaseCommand
,
CommandError
from
django.db.models
import
Q
from
django.db.models.functions
import
Lower
from
wei.models
import
WEIClub
,
Bus
,
BusTeam
,
WEIMembership
class
Command
(
BaseCommand
):
help
=
"
Export WEI registrations.
"
def
add_arguments
(
self
,
parser
):
parser
.
add_argument
(
'
--bus
'
,
'
-b
'
,
choices
=
[
bus
.
name
for
bus
in
Bus
.
objects
.
all
()],
type
=
str
,
default
=
None
,
help
=
'
Filter by bus
'
)
parser
.
add_argument
(
'
--team
'
,
'
-t
'
,
choices
=
[
team
.
name
for
team
in
BusTeam
.
objects
.
all
()],
type
=
str
,
default
=
None
,
help
=
'
Filter by team. Type
"
none
"
if you want to select the members
'
+
'
that are not in a team.
'
)
parser
.
add_argument
(
'
--year
'
,
'
-y
'
,
type
=
int
,
default
=
None
,
help
=
'
Select the year of the concerned WEI. Default: last year
'
)
parser
.
add_argument
(
'
--sep
'
,
type
=
str
,
default
=
'
|
'
,
help
=
'
Select the CSV separator.
'
)
def
handle
(
self
,
*
args
,
**
options
):
year
=
options
[
"
year
"
]
if
year
:
try
:
wei
=
WEIClub
.
objects
.
get
(
year
=
year
)
except
WEIClub
.
DoesNotExist
:
raise
CommandError
(
"
The WEI of year {:d} does not exist.
"
.
format
(
year
,))
else
:
wei
=
WEIClub
.
objects
.
order_by
(
'
-year
'
).
first
()
bus
=
options
[
"
bus
"
]
if
bus
:
try
:
bus
=
Bus
.
objects
.
filter
(
wei
=
wei
).
get
(
name
=
bus
)
except
Bus
.
DoesNotExist
:
raise
CommandError
(
"
The bus {} does not exist or does not belong to the WEI {}.
"
.
format
(
bus
,
wei
.
name
,))
team
=
options
[
"
team
"
]
if
team
:
if
team
.
lower
()
==
"
none
"
:
team
=
0
else
:
try
:
team
=
BusTeam
.
objects
.
filter
(
Q
(
bus
=
bus
)
|
Q
(
wei
=
wei
)).
get
(
name
=
team
)
bus
=
team
.
bus
except
BusTeam
.
DoesNotExist
:
raise
CommandError
(
"
The bus {} does not exist or does not belong to the bus {} neither the wei {}.
"
.
format
(
team
,
bus
.
name
if
bus
else
"
<None>
"
,
wei
.
name
,))
qs
=
WEIMembership
.
objects
qs
=
qs
.
filter
(
club
=
wei
).
order_by
(
Lower
(
'
bus__name
'
),
Lower
(
'
team__name
'
),
'
user__profile__promotion
'
,
Lower
(
'
user__last_name
'
),
Lower
(
'
user__first_name
'
),
).
distinct
()
if
bus
:
qs
=
qs
.
filter
(
bus
=
bus
)
if
team
is
not
None
:
qs
=
qs
.
filter
(
team
=
team
if
team
else
None
)
sep
=
options
[
"
sep
"
]
self
.
stdout
.
write
(
"
Nom|Prénom|Date de naissance|Genre|Département|Année|Section|Bus|Équipe|Rôles
"
.
replace
(
sep
,
sep
))
for
membership
in
qs
.
all
():
user
=
membership
.
user
registration
=
membership
.
registration
bus
=
membership
.
bus
team
=
membership
.
team
s
=
user
.
last_name
s
+=
sep
+
user
.
first_name
s
+=
sep
+
str
(
registration
.
birth_date
)
s
+=
sep
+
registration
.
get_gender_display
()
s
+=
sep
+
user
.
profile
.
get_department_display
()
s
+=
sep
+
str
(
user
.
profile
.
ens_year
)
+
"
A
"
s
+=
sep
+
user
.
profile
.
section_generated
s
+=
sep
+
bus
.
name
s
+=
sep
+
(
team
.
name
if
team
else
"
--
"
)
s
+=
sep
+
"
,
"
.
join
(
role
.
name
for
role
in
membership
.
roles
.
filter
(
~
Q
(
name
=
"
Adhérent WEI
"
)).
all
())
self
.
stdout
.
write
(
s
)
management/commands/extract_ml_registrations.py
0 → 100644
View file @
f0aa4269
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from
datetime
import
date
from
django.core.management
import
BaseCommand
from
django.db.models
import
Q
from
member.models
import
Membership
,
Club
from
wei.models
import
WEIClub
class
Command
(
BaseCommand
):
help
=
"
Get mailing list registrations from the last wei.
"
\
"
Usage: manage.py extract_ml_registrations -t {events,art,sport}.
"
\
"
You can write this into a file with a pipe, then paste the document into your mail manager.
"
def
add_arguments
(
self
,
parser
):
parser
.
add_argument
(
'
--type
'
,
'
-t
'
,
choices
=
[
"
members
"
,
"
clubs
"
,
"
events
"
,
"
art
"
,
"
sport
"
],
default
=
"
members
"
,
help
=
'
Select the type of the mailing list (default members)
'
)
parser
.
add_argument
(
'
--year
'
,
'
-y
'
,
type
=
int
,
default
=
None
,
help
=
'
Select the year of the concerned WEI. Default: last year
'
)
def
handle
(
self
,
*
args
,
**
options
):
if
options
[
"
type
"
]
==
"
members
"
:
for
membership
in
Membership
.
objects
.
filter
(
club__name
=
"
BDE
"
,
date_start__lte
=
date
.
today
(),
date_end__gte
=
date
.
today
(),
).
all
():
self
.
stdout
.
write
(
membership
.
user
.
email
)
return
if
options
[
"
type
"
]
==
"
clubs
"
:
for
club
in
Club
.
objects
.
all
():
self
.
stdout
.
write
(
club
.
email
)
return
if
options
[
"
year
"
]
is
None
:
wei
=
WEIClub
.
objects
.
order_by
(
'
-year
'
).
first
()
else
:
wei
=
WEIClub
.
objects
.
filter
(
year
=
options
[
"
year
"
])
if
wei
.
exists
():
wei
=
wei
.
get
()
else
:
wei
=
WEIClub
.
objects
.
order_by
(
'
-year
'
).
first
()
self
.
stderr
.
write
(
self
.
style
.
WARNING
(
"
Warning: there was no WEI in year
"
+
str
(
options
[
"
year
"
])
+
"
.
"
+
"
Assuming the last WEI (year
"
+
str
(
wei
.
year
)
+
"
)
"
))
q
=
Q
(
ml_events_registration
=
True
)
if
options
[
"
type
"
]
==
"
events
"
else
Q
(
ml_art_registration
=
True
)
\
if
options
[
"
type
"
]
==
"
art
"
else
Q
(
ml_sport_registration
=
True
)
registrations
=
wei
.
users
.
filter
(
q
)
for
registration
in
registrations
.
all
():
self
.
stdout
.
write
(
registration
.
user
.
email
)
management/commands/import_nk15.py
View file @
f0aa4269
This diff is collapsed.
Click to expand it.
management/commands/make_su.py
View file @
f0aa4269
#
!/usr/bin/env python3
#
Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from
django.core.management.base
import
BaseCommand
from
django.contrib.auth.models
import
User
class
Command
(
BaseCommand
):
def
add_arguments
(
self
,
parser
):
parser
.
add_argument
(
'
username
'
,
nargs
=
'
+
'
,
type
=
str
)
parser
.
add_argument
(
'
-S
'
,
"
--SUPER
"
,
action
=
'
store_true
'
,
help
=
'
make superuser
'
)
def
add_arguments
(
self
,
parser
):
parser
.
add_argument
(
'
username
'
,
nargs
=
'
+
'
,
type
=
str
)
parser
.
add_argument
(
'
-S
'
,
"
--SUPER
"
,
action
=
'
store_true
'
,
help
=
'
make superuser
'
)
parser
.
add_argument
(
'
-s
'
,
"
--STAFF
"
,
action
=
'
store_true
'
,
help
=
'
make staff
'
)
def
handle
(
self
,
*
args
,
**
kwargs
):
def
handle
(
self
,
*
args
,
**
kwargs
):
for
uname
in
kwargs
[
"
username
"
]:
user
=
User
.
objects
.
get
(
username
=
uname
)
user
.
is_active
=
True
if
kwargs
[
'
S
UPER
'
]:
if
kwargs
[
'
S
TAFF
'
]:
user
.
is_staff
=
True
if
kwargs
[
'
SUPER
'
]:
user
.
is_superuser
=
True
user
.
save
()
management/commands/wei_algorithm.py
0 → 100644
View file @
f0aa4269
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from
django.core.management
import
BaseCommand
from
wei.forms
import
CurrentSurvey
class
Command
(
BaseCommand
):
help
=
"
Attribute to each first year member a bus for the WEI
"
def
handle
(
self
,
*
args
,
**
options
):
"""
Run the WEI algorithm to attribute a bus to each first year member.
"""
CurrentSurvey
.
get_algorithm_class
()().
run_algorithm
()
signals.py
0 → 100644
View file @
f0aa4269
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
import
os
import
sys
from
django.conf
import
settings
from
django.core.mail
import
send_mail
from
django.template.loader
import
render_to_string
from
django.views.debug
import
ExceptionReporter
def
send_mail_on_exception
(
request
,
**
kwargs
):
"""
When an error occurs on the Note Kfet, a mail is automatically sent to the webmasters.
"""
if
settings
.
DEBUG
:
# Don't need to send a mail in debug mode, errors are already displayed in console and in the response view.
return
try
:
exc_info
=
sys
.
exc_info
()
exc_type
=
exc_info
[
0
]
exc
=
exc_info
[
1
]
tb
=
exc_info
[
2
]
reporter
=
ExceptionReporter
(
request
=
request
,
exc_type
=
exc_type
,
exc_value
=
exc
,
tb
=
tb
)
note_sender
=
os
.
getenv
(
"
NOTE_MAIL
"
,
"
notekfet@example.com
"
)
webmaster
=
os
.
getenv
(
"
WEBMASTER_MAIL
"
,
"
notekfet@example.com
"
)
message
=
render_to_string
(
'
scripts/mail-error500.txt
'
,
context
=
{
"
error
"
:
reporter
.
get_traceback_text
()})
message_html
=
render_to_string
(
'
scripts/mail-error500.html
'
,
context
=
{
"
error
"
:
reporter
.
get_traceback_html
()})
send_mail
(
"
Erreur dans la Note Kfet
"
,
message
,
note_sender
,
[
webmaster
],
html_message
=
message_html
)
except
BaseException
as
e
:
sys
.
stderr
.
write
(
"
Une erreur est survenue lors de l
'
envoi d
'
un mail, pour signaler une erreur.
"
)
raise
e