<commit_before>from django.core.management.base import BaseCommand, CommandError
from django.core.management.commands.migrate import Command as Migrate
from .backup import Command as Backup
from ecolle.settings import CHEMINVERSECOLLE
import os
from urllib.request import urlopen
from urllib.error import HTTPError
import tarfile
from shutil import rmtree, copy as filecopy

class Command(BaseCommand):
    help = """mise à jour de e-colle"""

    def clean(self):
        """nettoie dans le cas d'un échec"""
        directory = os.path.join("..","e-colle-new")
        if os.path.isdir(directory):
            rmtree(directory, True)
        reps = [f for f in os.listdir("..") if os.path.isdir(f) and f.startswith("stephanekirsch-e-colle")]
        if len(reps) > 0:
            for rep in reps:
                rmtree(os.path.join("..",rep))
        if os.path.isfile(os.path.join("..","e-colle.tar.gz")):
            os.remove(os.path.join("..","e-colle.tar.gz"))

    def add_arguments(self, parser):
        parser.add_argument('version', nargs=1 , type=str)

    def handle(self, *args, **options):
        try:
            version = options.pop('version')[0]
            url = "https://github.com/stephanekirsch/e-colle/tarball/" + version
            try:
                with urlopen(url) as fichier, open(os.path.join("..","e-colle.tar.gz"),"wb") as fichier_zip:
                    self.stdout.write("téléchargement de la version {} de e-colle".format(version))
                    self.stdout.write("progression: 0.0%",ending="\r")
                    taille = fichier.getheader('Content-Length')
                    taille = int(taille) if taille is not None else 3000000
                    taille = int(taille)
                    CHUNK = 32*1024
                    progress = 0
                    efface = 4
                    while True:
                        chunk = fichier.read(CHUNK)
                        if not chunk:
                            break
                        else:
                            progress += CHUNK
                            progress = min(taille,progress)
                            pourcent = "progression: {:.2f}%".format(100*progress/taille)
                            self.stdout.write(pourcent, ending="\r")
                            fichier_zip.write(chunk)
                    self.stdout.write("\ntéléchargement terminé")
            except HTTPError:
                raise CommandError("la version précisée: {} n'existe pas".format(version))
            # décompression du fichier zip
            archive_zip = tarfile.open(os.path.join("..","e-colle.tar.gz"),"r:gz")
            archive_zip.extractall("..")
            # on renomme le nouveau e-colle
            reps = [f for f in os.listdir("..") if not os.path.isfile(f) and f.startswith("stephanekirsch-e-colle")]
            os.rename(os.path.join("..",reps[0]),os.path.join("..","e-colle-new"))
            # on récupère les données de config de l'ancien e-colle pour les passer au nouveau.
            self.stdout.write("copie des données de configuration")
            from ecolle.settings import DEFAULT_ADMIN_PASSWD, DEFAULT_SECRETARIAT_PASSWD, EMAIL_ADMIN, EMAIL_SECRETARIAT, IP_FILTRE_ADMIN,\
            IP_FILTRE_ADRESSES, DATABASES, BDD, IMAGEMAGICK, ALLOWED_HOSTS, INTERNAL_IPS, SECRET_KEY, TIME_ZONE, HEURE_DEBUT, HEURE_FIN, INTERVALLE
            db = DATABASES["default"]
            with open(os.path.join("..","e-colle-new","ecolle","config.py"),"wt",encoding="utf8") as fichier:
                    fichier.write("DEFAULT_ADMIN_PASSWD = '{}' # mot de passe de l'utilisateur administrateur\n".format(DEFAULT_ADMIN_PASSWD))
                    fichier.write("DEFAULT_SECRETARIAT_PASSWD = '{}' # mot de passe de l'utilisateur secrétariat\n".format(DEFAULT_SECRETARIAT_PASSWD))
                    fichier.write("EMAIL_ADMIN = '{}' # email de l'utilisateur administateur\n".format(EMAIL_ADMIN))
                    fichier.write("EMAIL_SECRETARIAT = '{}' # email de l'utilisateur secrétariat\n".format(EMAIL_SECRETARIAT))
                    fichier.write("IP_FILTRE_ADMIN = {} # filtrage IP pour l'utilisateur administrateur\n".format(IP_FILTRE_ADMIN))
                    fichier.write("IP_FILTRE_ADRESSES = (")
                    taille = len(IP_FILTRE_ADRESSES)
                    ip_filtre_adresses = ",".join("'" + ip + "'" for ip in IP_FILTRE_ADRESSES)
                    if taille == 1:
                        ip_filtre_adresses += ","
                    fichier.write(ip_filtre_adresses)
                    fichier.write(") # si IP_FILTER_ADMIN vaut True, liste des IPS autorisées pour l'utilisateur admin (REGEXP)\n")
                    fichier.write("DB_ENGINE = '{}' # base de données (mysql ou postgresql ou sqlite3)\n".format(db['ENGINE']))
                    fichier.write("DB_USER = '{}' # nom de l'utilisateur qui a les droits sur la base de données\n".format(db['USER']))
                    fichier.write("DB_NAME = '{}' # nom de la base de données (ou du fichier .db pour SQLite)".format(db['NAME']))
                    fichier.write("DB_PASSWORD = '{}' # mot de passe pour se connecter à la base de données\n".format(db['PASSWORD']))
                    fichier.write("DB_HOST = '{}' # adresse locale de la base de données\n".format(db['HOST']))
                    fichier.write("DB_PORT = '{}' # port de la BDD, vide par défaut. À renseigner si la BDD se trouve sur un port particulier\n".format(db['PORT']))
                    fichier.write("IMAGEMAGICK = {} # utilisation de ImageMagick pour faire des miniatures de la première page des pdf programmes de colle\n".format(IMAGEMAGICK ))
                    fichier.write("ALLOWED_HOSTS = {} # liste des noms de domaine autorisés pour accéder à e-colle\n".format(ALLOWED_HOSTS))
                    fichier.write("INTERNAL_IPS = {} # liste des IP autorisées pour accéder en interne à e-colle quand debug est True\n".format(INTERNAL_IPS))
                    fichier.write("SECRET_KEY = '{}' # clé secrète aléatoire de 50 caractères\n".format(SECRET_KEY))
                    fichier.write("TIME_ZONE = '{}' # fuseau horaire\n".format(TIME_ZONE))
                    fichier.write("HEURE_DEBUT = {} # heure de début des colles (en minutes depuis minuit)\n".format(HEURE_DEBUT))
                    fichier.write("HEURE_FIN = {} # heure de fin des colles (en minutes depuis minuit)\n".format(HEURE_FIN))
                    fichier.write("INTERVALLE = {} # intervalle entre 2 créneaux (en minutes)".format(INTERVALLE))
            self.stdout.write("copie terminée")
            self.stdout.write("sauvegarde de la base de données pour avoir un point de sauvegarde en cas d'échec de la mise à jour")
            try:
                backup = Backup()
                backup.handle(backup_media = False, **options)<commit_msg>correction bug update<commit_after>from django.core.management.base import BaseCommand, CommandError
from django.core.management.commands.migrate import Command as Migrate
from .backup import Command as Backup
from ecolle.settings import CHEMINVERSECOLLE
import os
from urllib.request import urlopen
from urllib.error import HTTPError
import tarfile
from shutil import rmtree, copy as filecopy

class Command(BaseCommand):
    help = """mise à jour de e-colle"""

    def clean(self):
        """nettoie dans le cas d'un échec"""
        directory = os.path.join("..","e-colle-new")
        if os.path.isdir(directory):
            rmtree(directory, True)
        reps = [f for f in os.listdir("..") if os.path.isdir(f) and f.startswith("stephanekirsch-e-colle")]
        if len(reps) > 0:
            for rep in reps:
                rmtree(os.path.join("..",rep))
        if os.path.isfile(os.path.join("..","e-colle.tar.gz")):
            os.remove(os.path.join("..","e-colle.tar.gz"))

    def add_arguments(self, parser):
        parser.add_argument('version', nargs=1 , type=str)

    def handle(self, *args, **options):
        try:
            version = options.pop('version')[0]
            url = "https://github.com/stephanekirsch/e-colle/tarball/" + version
            try:
                with urlopen(url) as fichier, open(os.path.join("..","e-colle.tar.gz"),"wb") as fichier_zip:
                    self.stdout.write("téléchargement de la version {} de e-colle".format(version))
                    self.stdout.write("progression: 0.0%",ending="\r")
                    taille = fichier.getheader('Content-Length')
                    taille = int(taille) if taille is not None else 3000000
                    taille = int(taille)
                    CHUNK = 32*1024
                    progress = 0
                    efface = 4
                    while True:
                        chunk = fichier.read(CHUNK)
                        if not chunk:
                            break
                        else:
                            progress += CHUNK
                            progress = min(taille,progress)
                            pourcent = "progression: {:.2f}%".format(100*progress/taille)
                            self.stdout.write(pourcent, ending="\r")
                            fichier_zip.write(chunk)
                    self.stdout.write("\ntéléchargement terminé")
            except HTTPError:
                raise CommandError("la version précisée: {} n'existe pas".format(version))
            # décompression du fichier zip
            archive_zip = tarfile.open(os.path.join("..","e-colle.tar.gz"),"r:gz")
            archive_zip.extractall("..")
            # on renomme le nouveau e-colle
            reps = [f for f in os.listdir("..") if not os.path.isfile(f) and f.startswith("stephanekirsch-e-colle")]
            os.rename(os.path.join("..",reps[0]),os.path.join("..","e-colle-new"))
            # on récupère les données de config de l'ancien e-colle pour les passer au nouveau.
            self.stdout.write("copie des données de configuration")
            from ecolle.settings import DEFAULT_ADMIN_PASSWD, DEFAULT_SECRETARIAT_PASSWD, EMAIL_ADMIN, EMAIL_SECRETARIAT, IP_FILTRE_ADMIN,\
            IP_FILTRE_ADRESSES, DATABASES, BDD, IMAGEMAGICK, ALLOWED_HOSTS, INTERNAL_IPS, SECRET_KEY, TIME_ZONE, HEURE_DEBUT, HEURE_FIN, INTERVALLE
            db = DATABASES["default"]
            with open(os.path.join("..","e-colle-new","ecolle","config.py"),"wt",encoding="utf8") as fichier:
                    fichier.write("DEFAULT_ADMIN_PASSWD = '{}' # mot de passe de l'utilisateur administrateur\n".format(DEFAULT_ADMIN_PASSWD))
                    fichier.write("DEFAULT_SECRETARIAT_PASSWD = '{}' # mot de passe de l'utilisateur secrétariat\n".format(DEFAULT_SECRETARIAT_PASSWD))
                    fichier.write("EMAIL_ADMIN = '{}' # email de l'utilisateur administateur\n".format(EMAIL_ADMIN))
                    fichier.write("EMAIL_SECRETARIAT = '{}' # email de l'utilisateur secrétariat\n".format(EMAIL_SECRETARIAT))
                    fichier.write("IP_FILTRE_ADMIN = {} # filtrage IP pour l'utilisateur administrateur\n".format(IP_FILTRE_ADMIN))
                    fichier.write("IP_FILTRE_ADRESSES = (")
                    taille = len(IP_FILTRE_ADRESSES)
                    ip_filtre_adresses = ",".join("'" + ip + "'" for ip in IP_FILTRE_ADRESSES)
                    if taille == 1:
                        ip_filtre_adresses += ","
                    fichier.write(ip_filtre_adresses)
                    fichier.write(") # si IP_FILTER_ADMIN vaut True, liste des IPS autorisées pour l'utilisateur admin (REGEXP)\n")
                    fichier.write("DB_ENGINE = '{}' # base de données (mysql ou postgresql ou sqlite3)\n".format(BDD))
                    fichier.write("DB_USER = '{}' # nom de l'utilisateur qui a les droits sur la base de données\n".format(db['USER']))
                    fichier.write("DB_NAME = '{}' # nom de la base de données (ou du fichier .db pour SQLite)\n".format(db['NAME']))
                    fichier.write("DB_PASSWORD = '{}' # mot de passe pour se connecter à la base de données\n".format(db['PASSWORD']))
                    fichier.write("DB_HOST = '{}' # adresse locale de la base de données\n".format(db['HOST']))
                    fichier.write("DB_PORT = '{}' # port de la BDD, vide par défaut. À renseigner si la BDD se trouve sur un port particulier\n".format(db['PORT']))
                    fichier.write("IMAGEMAGICK = {} # utilisation de ImageMagick pour faire des miniatures de la première page des pdf programmes de colle\n".format(IMAGEMAGICK ))
                    fichier.write("ALLOWED_HOSTS = {} # liste des noms de domaine autorisés pour accéder à e-colle\n".format(ALLOWED_HOSTS))
                    fichier.write("INTERNAL_IPS = {} # liste des IP autorisées pour accéder en interne à e-colle quand debug est True\n".format(INTERNAL_IPS))
                    fichier.write("SECRET_KEY = '{}' # clé secrète aléatoire de 50 caractères\n".format(SECRET_KEY))
                    fichier.write("TIME_ZONE = '{}' # fuseau horaire\n".format(TIME_ZONE))
                    fichier.write("HEURE_DEBUT = {} # heure de début des colles (en minutes depuis minuit)\n".format(HEURE_DEBUT))
                    fichier.write("HEURE_FIN = {} # heure de fin des colles (en minutes depuis minuit)\n".format(HEURE_FIN))
                    fichier.write("INTERVALLE = {} # intervalle entre 2 créneaux (en minutes)".format(INTERVALLE))
            self.stdout.write("copie terminée")
            self.stdout.write("sauvegarde de la base de données pour avoir un point de sauvegarde en cas d'échec de la mise à jour")
            try:
                backup = Backup()
                backup.handle(backup_media = False, **options)
{'fraction_non_alphanumeric': 0.12074122711023565, 'fraction_numerical': 0.0045232363026191, 'mean_word_length': 2.1702127659574466, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1671816', 'n_tokens_mistral': 4400, 'n_tokens_neox': 4273, 'n_words': 943}