install
This commit is contained in:
@@ -11,7 +11,7 @@ echo "==== system essential"
|
|||||||
sudo apt -y install build-essential openssl git pkg-config redis supervisor sqlitebrowser samba-client cifs-utils gettext
|
sudo apt -y install build-essential openssl git pkg-config redis supervisor sqlitebrowser samba-client cifs-utils gettext
|
||||||
|
|
||||||
echo "==== python3 install"
|
echo "==== python3 install"
|
||||||
sudo apt -y install python3-dev python3-pip python3-venv default-libmysqlclient-dev libmariadb-dev libpq-dev python3-picamera2
|
sudo apt -y install python3-dev python3-pip python3-venv libpq-dev default-libmysqlclient-dev libmariadb-dev python3-picamera2
|
||||||
|
|
||||||
echo "==== supervisor http access login:pass => root:toor"
|
echo "==== supervisor http access login:pass => root:toor"
|
||||||
sudo cp supervisor-inet_http.conf /etc/supervisor/conf.d/
|
sudo cp supervisor-inet_http.conf /etc/supervisor/conf.d/
|
||||||
@@ -5,7 +5,7 @@ sudo apt install libprotobuf-dev protobuf-compiler
|
|||||||
|
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||||
|
|
||||||
source .cargo/env
|
source $HOME/.cargo/env
|
||||||
cargo --version
|
cargo --version
|
||||||
rustc --version
|
rustc --version
|
||||||
cargo install reductstore
|
cargo install reductstore
|
||||||
Executable
+60
@@ -0,0 +1,60 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script d'installation et de configuration d'un client Samba sur Raspberry Pi 4 (Debian Trixie)
|
||||||
|
|
||||||
|
# Mise à jour des paquets
|
||||||
|
echo "[1/5] Mise à jour des paquets..."
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
|
||||||
|
# Installation des paquets nécessaires (client Samba et outils de montage)
|
||||||
|
echo "[2/5] Installation des paquets nécessaires..."
|
||||||
|
sudo apt install -y cifs-utils smbclient
|
||||||
|
|
||||||
|
# Création du point de montage pour le partage distant
|
||||||
|
echo "[3/5] Création du point de montage..."
|
||||||
|
sudo mkdir -p /mnt/samba/public
|
||||||
|
sudo mkdir -p /mnt/samba/secure
|
||||||
|
|
||||||
|
# Demande des informations de connexion au partage Samba
|
||||||
|
read -p "Adresse IP ou nom d'hôte du serveur Samba (ex: 192.168.1.10) : " samba_server
|
||||||
|
read -p "Nom du partage public (ex: public) : " public_share
|
||||||
|
read -p "Nom du partage sécurisé (ex: secure) : " secure_share
|
||||||
|
read -p "Nom d'utilisateur Samba (laissez vide si partage public uniquement) : " samba_user
|
||||||
|
if [ -n "$samba_user" ]; then
|
||||||
|
read -s -p "Mot de passe de l'utilisateur Samba : " samba_password
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configuration des identifiants Samba (pour le partage sécurisé)
|
||||||
|
if [ -n "$samba_user" ]; then
|
||||||
|
echo "[4/5] Configuration des identifiants pour le partage sécurisé..."
|
||||||
|
sudo bash -c "echo 'username=$samba_user' > /etc/samba/credentials"
|
||||||
|
sudo bash -c "echo 'password=$samba_password' >> /etc/samba/credentials"
|
||||||
|
sudo chmod 600 /etc/samba/credentials
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configuration du montage automatique dans /etc/fstab
|
||||||
|
echo "[5/5] Configuration du montage automatique dans /etc/fstab..."
|
||||||
|
# Sauvegarde du fichier fstab existant
|
||||||
|
sudo cp /etc/fstab /etc/fstab.bak
|
||||||
|
|
||||||
|
# Ajout des lignes pour monter les partages Samba
|
||||||
|
if [ -n "$samba_user" ]; then
|
||||||
|
# Montage du partage sécurisé
|
||||||
|
sudo bash -c "echo '//$samba_server/$secure_share /mnt/samba/secure cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,file_mode=0770,dir_mode=0770 0 0' >> /etc/fstab"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Montage du partage public (sans authentification)
|
||||||
|
sudo bash -c "echo '//$samba_server/$public_share /mnt/samba/public cifs guest,uid=1000,gid=1000,file_mode=0777,dir_mode=0777 0 0' >> /etc/fstab"
|
||||||
|
|
||||||
|
# Montage des partages
|
||||||
|
echo "Montage des partages Samba..."
|
||||||
|
sudo mount -a
|
||||||
|
|
||||||
|
# Vérification du montage
|
||||||
|
echo "Vérification des partages montés :"
|
||||||
|
df -h | grep samba
|
||||||
|
|
||||||
|
echo "Installation et configuration du client Samba terminées !"
|
||||||
|
echo "Les partages sont montés dans /mnt/samba/public et /mnt/samba/secure."
|
||||||
|
|
||||||
Executable
+76
@@ -0,0 +1,76 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script d'installation et de configuration de MariaDB
|
||||||
|
# Utilisation : source mariadb_config.sh && ./install_mariadb.sh
|
||||||
|
|
||||||
|
|
||||||
|
ENV_FILE="../test_tube_scanner/.env"
|
||||||
|
source $ENV_FILE
|
||||||
|
|
||||||
|
# Vérifie que le fichier de configuration est sourcé
|
||||||
|
if [ -z "$DATABASE_ROOT_PASSWORD" ] || [ -z "$DATABASE_NAME" ] || [ -z "$DATABASE_USER" ] || [ -z "$DATABASE_PASSWORD" ]; then
|
||||||
|
echo "Erreur : Les variables de configuration ne sont pas définies."
|
||||||
|
echo "Sourcez le fichier de configuration avant d'exécuter ce script :"
|
||||||
|
echo " source mariadb_config.sh && ./install_mariadb.sh"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mise à jour des paquets
|
||||||
|
echo "[1/6] Mise à jour des paquets..."
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
|
||||||
|
# Installation de MariaDB
|
||||||
|
echo "[2/6] Installation de MariaDB..."
|
||||||
|
sudo apt install -y mariadb-server
|
||||||
|
|
||||||
|
|
||||||
|
# Sécurisation de MariaDB (désactive l'accès root à distance, supprime les bases de test, etc.)
|
||||||
|
echo "[3/6] Sécurisation de MariaDB..."
|
||||||
|
sudo mariadb_secure_installation <<EOF
|
||||||
|
|
||||||
|
n
|
||||||
|
y
|
||||||
|
$DATABASE_ROOT_PASSWORD
|
||||||
|
$DATABASE_ROOT_PASSWORD
|
||||||
|
y
|
||||||
|
y
|
||||||
|
y
|
||||||
|
y
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Création de la base de données, de l'utilisateur et attribution des droits
|
||||||
|
echo "[4/6] Configuration de la base de données '$DATABASE_NAME' et de l'utilisateur '$DATABASE_USER'..."
|
||||||
|
sudo mariadb -u root -p"$DATABASE_ROOT_PASSWORD" <<EOF
|
||||||
|
CREATE DATABASE IF NOT EXISTS $DATABASE_NAME;
|
||||||
|
CREATE USER IF NOT EXISTS '$DATABASE_USER'@'localhost' IDENTIFIED BY '$DATABASE_PASSWORD';
|
||||||
|
GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO '$DATABASE_USER'@'localhost';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Autoriser l'accès à distance (optionnel, si nécessaire)
|
||||||
|
# Remplace '%' par une IP spécifique pour plus de sécurité
|
||||||
|
echo "[5/6] Autorisation de l'accès à distance pour '$DATABASE_USER' (optionnel)..."
|
||||||
|
sudo mariadb -u root -p"$DATABASE_ROOT_PASSWORD" <<EOF
|
||||||
|
CREATE USER IF NOT EXISTS '$DATABASE_USER'@'%' IDENTIFIED BY '$DATABASE_PASSWORD';
|
||||||
|
GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO '$DATABASE_USER'@'%';
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Redémarrage du service MariaDB
|
||||||
|
echo "[6/6] Redémarrage du service MariaDB..."
|
||||||
|
sudo systemctl restart mariadb
|
||||||
|
sudo systemctl enable mariadb
|
||||||
|
|
||||||
|
# Vérification du statut
|
||||||
|
echo "Statut du service MariaDB :"
|
||||||
|
sudo systemctl status mariadb --no-pager
|
||||||
|
|
||||||
|
# Affichage des informations de connexion
|
||||||
|
echo ""
|
||||||
|
echo "=== Configuration terminée ==="
|
||||||
|
echo "Base de données : $DATABASE_NAME"
|
||||||
|
echo "Utilisateur : $DATABASE_USER"
|
||||||
|
echo "Mot de passe : $DATABASE_PASSWORD"
|
||||||
|
echo ""
|
||||||
|
echo "Pour te connecter à MariaDB :"
|
||||||
|
echo " mariadb -u $DATABASE_USER -p$DATABASE_PASSWORD $DATABASE_NAME"
|
||||||
Executable
+81
@@ -0,0 +1,81 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script d'installation d'Adminer avec Nginx (sans Apache) + détection automatique de PHP
|
||||||
|
|
||||||
|
# Mise à jour des paquets
|
||||||
|
echo "[1/6] Mise à jour des paquets..."
|
||||||
|
sudo apt update && sudo apt upgrade -y
|
||||||
|
|
||||||
|
# Installation de Nginx et PHP-FPM (avec détection de la version de PHP)
|
||||||
|
echo "[2/6] Installation de Nginx et PHP-FPM..."
|
||||||
|
sudo apt install -y nginx
|
||||||
|
|
||||||
|
# Détection de la version de PHP installée (ou installation si absente)
|
||||||
|
PHP_VERSION=$(ls /etc/php/ | grep -E '^[0-9]+\.[0-9]+$' | sort -V | tail -n 1)
|
||||||
|
if [ -z "$PHP_VERSION" ]; then
|
||||||
|
echo "Aucune version de PHP détectée. Installation de PHP 8.2 par défaut..."
|
||||||
|
sudo apt install -y php8.2 php8.2-fpm php8.2-mysql
|
||||||
|
PHP_VERSION="8.2"
|
||||||
|
else
|
||||||
|
echo "Version de PHP détectée : $PHP_VERSION"
|
||||||
|
sudo apt install -y "php$PHP_VERSION" "php$PHP_VERSION-fpm" "php$PHP_VERSION-mysql"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Téléchargement de la dernière version stable d'Adminer
|
||||||
|
echo "[3/6] Téléchargement de la dernière version d'Adminer..."
|
||||||
|
ADMINER_VERSION=$(curl -s https://api.github.com/repos/vrana/adminer/releases/latest | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
|
||||||
|
sudo mkdir -p /var/www/adminer
|
||||||
|
sudo wget "https://github.com/vrana/adminer/releases/download/v$ADMINER_VERSION/adminer-$ADMINER_VERSION.php" -O /var/www/adminer/index.php
|
||||||
|
|
||||||
|
# Configuration de Nginx pour Adminer
|
||||||
|
echo "[4/6] Configuration de Nginx..."
|
||||||
|
sudo bash -c "
|
||||||
|
cat > /etc/nginx/sites-available/adminer <<'END'
|
||||||
|
server {
|
||||||
|
listen 81;
|
||||||
|
server_name scanner.local;
|
||||||
|
|
||||||
|
root /var/www/adminer;
|
||||||
|
index index.php;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files \$uri \$uri/ =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ \.php$ {
|
||||||
|
include snippets/fastcgi-php.conf;
|
||||||
|
fastcgi_pass unix:/var/run/php/php${PHP_VERSION}-fpm.sock;
|
||||||
|
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
|
||||||
|
include fastcgi_params;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
END"
|
||||||
|
|
||||||
|
# Activation du site Nginx
|
||||||
|
sudo ln -s /etc/nginx/sites-available/adminer /etc/nginx/sites-enabled/
|
||||||
|
sudo nginx -t # Teste la configuration Nginx
|
||||||
|
|
||||||
|
# Redémarrage des services
|
||||||
|
echo "[5/6] Redémarrage de Nginx et PHP-FPM..."
|
||||||
|
sudo systemctl restart nginx "php${PHP_VERSION}-fpm"
|
||||||
|
sudo systemctl enable nginx "php${PHP_VERSION}-fpm"
|
||||||
|
|
||||||
|
# Ajout de l'entrée dans /etc/hosts (optionnel)
|
||||||
|
echo "[6/6] Ajout de 'scanner.local' dans /etc/hosts..."
|
||||||
|
echo "$(hostname -I | awk '{print $1}') scanner.local" | sudo tee -a /etc/hosts
|
||||||
|
|
||||||
|
# Affichage des informations
|
||||||
|
echo ""
|
||||||
|
echo "=== Installation terminée ==="
|
||||||
|
echo "Adminer est accessible à l'adresse : http://scanner.local:81"
|
||||||
|
echo "ou via l'IP locale : http://$(hostname -I | awk '{print $1}'):81"
|
||||||
|
echo "Version d'Adminer installée : $ADMINER_VERSION"
|
||||||
|
echo "Version de PHP utilisée : $PHP_VERSION"
|
||||||
|
echo "Ajouter 'scanner.local' au fichier hosts:"
|
||||||
|
echo " linux : /etc/hosts"
|
||||||
|
echo " windows: C:\Windows\System32\drivers\etc\hosts"
|
||||||
|
echo ""
|
||||||
|
echo "Pour accéder à Adminer depuis cette machine:"
|
||||||
|
echo " http://scanner.local:81"
|
||||||
|
echo "ou"
|
||||||
|
echo " http://$(hostname -I | awk '{print $1}')"
|
||||||
Executable
+84
@@ -0,0 +1,84 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Script d'installation et de configuration d'un serveur Samba sur Debian Trixie
|
||||||
|
|
||||||
|
# Mise à jour des paquets
|
||||||
|
echo "[1/6] Mise à jour des paquets..."
|
||||||
|
apt update && apt upgrade -y
|
||||||
|
|
||||||
|
# Installation de Samba
|
||||||
|
echo "[2/6] Installation de Samba..."
|
||||||
|
apt install -y samba samba-common
|
||||||
|
|
||||||
|
# Sauvegarde du fichier de configuration original
|
||||||
|
echo "[3/6] Sauvegarde du fichier smb.conf original..."
|
||||||
|
cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
|
||||||
|
|
||||||
|
# Configuration de Samba
|
||||||
|
echo "[4/6] Configuration de Samba..."
|
||||||
|
cat > /etc/samba/smb.conf << 'EOL'
|
||||||
|
[global]
|
||||||
|
workgroup = WORKGROUP
|
||||||
|
server string = Serveur Samba %h
|
||||||
|
netbios name = DebianSamba
|
||||||
|
security = user
|
||||||
|
map to guest = bad user
|
||||||
|
dns proxy = no
|
||||||
|
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=65536 SO_SNDBUF=65536
|
||||||
|
|
||||||
|
[public]
|
||||||
|
comment = Partage Public
|
||||||
|
path = /srv/samba/public
|
||||||
|
browsable = yes
|
||||||
|
guest ok = yes
|
||||||
|
read only = no
|
||||||
|
create mask = 0777
|
||||||
|
directory mask = 0777
|
||||||
|
|
||||||
|
[secure]
|
||||||
|
comment = Partage Sécurisé
|
||||||
|
path = /srv/samba/secure
|
||||||
|
browsable = yes
|
||||||
|
guest ok = no
|
||||||
|
read only = no
|
||||||
|
create mask = 0770
|
||||||
|
directory mask = 0770
|
||||||
|
valid users = @smbgroup
|
||||||
|
EOL
|
||||||
|
|
||||||
|
# Création des répertoires de partage
|
||||||
|
echo "[5/6] Création des répertoires de partage..."
|
||||||
|
mkdir -p /srv/samba/public
|
||||||
|
mkdir -p /srv/samba/secure
|
||||||
|
chmod -R 0777 /srv/samba/public
|
||||||
|
chmod -R 0770 /srv/samba/secure
|
||||||
|
|
||||||
|
# Création d'un groupe pour le partage sécurisé
|
||||||
|
echo "[5/6] Création du groupe smbgroup..."
|
||||||
|
groupadd smbgroup
|
||||||
|
|
||||||
|
# Ajout d'un utilisateur Samba (remplace 'utilisateur' par le nom d'utilisateur souhaité)
|
||||||
|
echo "[5/6] Ajout d'un utilisateur Samba..."
|
||||||
|
read -p "Entrez le nom de l'utilisateur Samba à créer : " username
|
||||||
|
if id "$username" &>/dev/null; then
|
||||||
|
echo "L'utilisateur $username existe déjà."
|
||||||
|
else
|
||||||
|
useradd -M -s /usr/sbin/nologin "$username"
|
||||||
|
usermod -aG smbgroup "$username"
|
||||||
|
(echo "motdepasse"; echo "motdepasse") | smbpasswd -a "$username"
|
||||||
|
echo "Utilisateur $username ajouté à Samba."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Redémarrage du service Samba
|
||||||
|
echo "[6/6] Redémarrage du service Samba..."
|
||||||
|
systemctl restart smbd
|
||||||
|
systemctl enable smbd
|
||||||
|
|
||||||
|
# Vérification du statut du service
|
||||||
|
echo "Statut du service Samba :"
|
||||||
|
systemctl status smbd --no-pager
|
||||||
|
|
||||||
|
echo "Installation et configuration de Samba terminées !"
|
||||||
|
echo "Le partage public est accessible sans authentification."
|
||||||
|
echo "Le partage sécurisé est accessible avec l'utilisateur $username et le mot de passe défini."
|
||||||
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
Montage samba:
|
|
||||||
=============
|
|
||||||
|
|
||||||
sudo nano /etc/samba/.smb_creds
|
|
||||||
username=user_windows
|
|
||||||
password=mot_de_passe
|
|
||||||
domain=WORKGROUP
|
|
||||||
|
|
||||||
sudo chmod 600 /etc/samba/.smb_creds
|
|
||||||
sudo chown root:root /etc/samba/.smb_creds
|
|
||||||
|
|
||||||
sudo mkdir -p /mnt/exports
|
|
||||||
sudo chown django:django /mnt/exports
|
|
||||||
|
|
||||||
sudo nano /etc/fstab
|
|
||||||
//192.168.1.210/scanner /mnt/exports_cam cifs credentials=/etc/samba/.smb_creds,uid=django,gid=django,file_mode=0664,dir_mode=0775,iocharset=utf8,vers=3.0,_netdev,nofail 0 0
|
|
||||||
|
|
||||||
@@ -74,9 +74,10 @@ DATABASE_POSTGRES_PORT=5432
|
|||||||
####
|
####
|
||||||
# database
|
# database
|
||||||
#
|
#
|
||||||
|
DATABASE_ROOT_PASSWORD=change_me
|
||||||
DATABASE_NAME=test_tube
|
DATABASE_NAME=test_tube
|
||||||
DATABASE_USER=test_tube
|
DATABASE_USER=test_tube
|
||||||
DATABASE_PASSWORD=ChangeMe
|
DATABASE_PASSWORD=change_me
|
||||||
|
|
||||||
####
|
####
|
||||||
## reductstore
|
## reductstore
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class WellAdmin(admin.ModelAdmin):
|
|||||||
list_display = ('name', 'author',)
|
list_display = ('name', 'author',)
|
||||||
|
|
||||||
class ConfigurationAdmin(admin.ModelAdmin):
|
class ConfigurationAdmin(admin.ModelAdmin):
|
||||||
list_display = ('name', 'author', 'use_rpicam', 'video_width_capture', 'video_height_capture', 'video_frame_rate', 'px_per_mm', 'active',)
|
list_display = ('name', 'author', 'use_rpicam', 'video_width_capture', 'video_height_capture', 'video_frame_rate', 'active',)
|
||||||
|
|
||||||
class MultiWellAdmin(admin.ModelAdmin):
|
class MultiWellAdmin(admin.ModelAdmin):
|
||||||
list_filter = ('author', )
|
list_filter = ('author', )
|
||||||
|
|||||||
@@ -44,8 +44,7 @@ class Configuration(models.Model):
|
|||||||
# Grbl configuration
|
# Grbl configuration
|
||||||
grbl_xmax = models.FloatField(_("Grbl Xmax"), help_text=_("CNC Grbl Xmax en mm"), blank=False, default=350.0)
|
grbl_xmax = models.FloatField(_("Grbl Xmax"), help_text=_("CNC Grbl Xmax en mm"), blank=False, default=350.0)
|
||||||
grbl_ymax = models.FloatField(_("Grbl Ymax"), help_text=_("CNC Grbl Ymax en mm"), blank=False, default=250.0)
|
grbl_ymax = models.FloatField(_("Grbl Ymax"), help_text=_("CNC Grbl Ymax en mm"), blank=False, default=250.0)
|
||||||
px_per_mm = models.FloatField(_("Pixel / mm"), help_text=_('Rapport pixel / déplacement en pixel/mm'), blank=False, default=2.5)
|
|
||||||
|
|
||||||
# camera configuration
|
# camera configuration
|
||||||
use_rpicam = models.BooleanField(_("Utiliser rpicam"), help_text=_("Par défaaut. Sinon USB webcam"), default=True)
|
use_rpicam = models.BooleanField(_("Utiliser rpicam"), help_text=_("Par défaaut. Sinon USB webcam"), default=True)
|
||||||
webcam_device_index = models.PositiveSmallIntegerField(_("Index de la webcam"), help_text=_("Index de la webcam (0, 1, ...) si présente"), default=2)
|
webcam_device_index = models.PositiveSmallIntegerField(_("Index de la webcam"), help_text=_("Index de la webcam (0, 1, ...) si présente"), default=2)
|
||||||
@@ -106,7 +105,7 @@ class MultiWell(models.Model):
|
|||||||
dy = models.FloatField(_("Pas Y"), help_text=_('Pas ou interval sur Y en mm'), blank=False, default=19.5)
|
dy = models.FloatField(_("Pas Y"), help_text=_('Pas ou interval sur Y en mm'), blank=False, default=19.5)
|
||||||
feed = models.PositiveIntegerField(_("Vitesse"), help_text=_('Vitesse déplacement en mm/mn '), blank=False, default=1000)
|
feed = models.PositiveIntegerField(_("Vitesse"), help_text=_('Vitesse déplacement en mm/mn '), blank=False, default=1000)
|
||||||
|
|
||||||
well_position = models.BooleanField(_("Positions"), help_text=_('Positions des puits générées ?'), default=False)
|
well_position = models.BooleanField(_("Positions"), help_text=_('Positions des puits générées ?. Non => efface WellPostion et recalcule les positions'), default=False)
|
||||||
active = models.BooleanField(_("Active"), default=True)
|
active = models.BooleanField(_("Active"), default=True)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user