Folosim un fisier csv, cu trei coloane
Fisierul Cohorte s3.csvLa cohorte avem încărcare cohorte
Sincronizare cohorte la cursuri - Exemplu seria 3
creez fisierul c2cs3.csv cohort 2 courses seria 3, cu continutul
Am modificat scriptul pentru a seta automat rolul utilizatorilor ca Student în momentul în care cohorta este sincronizată cu un curs. Acum include o verificare a rolului și setează roleid la rolul „student” (roleid = 5 în mod implicit în Moodle, dar verifică dacă este corect în baza ta de date).
student).Am adăugat suport pentru rol și verificarea roleid în baza de date.
<?php
// Script pentru sincronizarea cohortelor cu cursurile in Moodle și setarea rolului Student
define('CLI_SCRIPT', true);
require_once('/home/moodle/public_html/moodle/config.php');
require_once($CFG->libdir . '/clilib.php');
require_once($CFG->dirroot . '/enrol/locallib.php');
// Preluare parametri din linia de comandă
list($options, $unrecognized) = cli_get_params([
'help' => false,
'file' => null
], [
'h' => 'help',
'f' => 'file'
]);
if ($options['help'] || empty($options['file'])) {
echo "\nScript pentru sincronizarea cohortelor cu cursurile și setarea rolului.\n";
echo "\nUtilizare:\n";
echo "php sync_cohorts.php --file=/cale/catre/cohorts.csv\n";
echo "\nParametri:\n";
echo " --file, -f Calea către fișierul CSV care conține cohortele, cursurile și rolul\n";
echo " --help, -h Afișează acest mesaj de ajutor\n";
exit(0);
}
// Verificare existență fișier CSV
$csvfile = $options['file'];
if (!file_exists($csvfile)) {
cli_error("Fișierul CSV nu a fost găsit: {$csvfile}");
}
// Citire fișier CSV
if (($handle = fopen($csvfile, 'r')) !== false) {
$header = fgetcsv($handle);
if ($header === false || count($header) < 2) {
cli_error("Fișierul CSV trebuie să conțină cel puțin două coloane: cohortid și courseid.");
}
$cohort_col = array_search('cohortid', $header);
$course_col = array_search('courseid', $header);
$role_col = array_search('role', $header);
if ($cohort_col === false || $course_col === false) {
cli_error("Fișierul CSV trebuie să conțină coloanele 'cohortid' și 'courseid'.");
}
while (($data = fgetcsv($handle)) !== false) {
$cohortid = trim($data[$cohort_col]);
$courseid = trim($data[$course_col]);
$rolename = ($role_col !== false) ? trim($data[$role_col]) : 'student'; // Implicit student
// Verificare existență cohortă
$cohort = $DB->get_record('cohort', ['idnumber' => $cohortid], '*', IGNORE_MISSING);
if (!$cohort) {
cli_writeln("Cohorta cu ID-ul '{$cohortid}' nu a fost găsită.");
continue;
}
// Verificare existență curs
if (is_numeric($courseid)) {
$course = $DB->get_record('course', ['id' => $courseid], '*', IGNORE_MISSING);
} else {
$course = $DB->get_record('course', ['shortname' => $courseid], '*', IGNORE_MISSING);
}
if (!$course) {
cli_writeln("Cursul cu ID-ul sau numele scurt '{$courseid}' nu a fost găsit.");
continue;
}
// Obține ID-ul rolului specificat
$role = $DB->get_record('role', ['shortname' => $rolename], '*', IGNORE_MISSING);
if (!$role) {
cli_writeln("Rolul '{$rolename}' nu a fost găsit. Se utilizează rolul implicit 'student'.");
$role = $DB->get_record('role', ['shortname' => 'student'], '*', IGNORE_MISSING);
}
if (!$role) {
cli_error("Rolul 'student' nu a fost găsit în Moodle. Verifică lista de roluri disponibile.");
}
$roleid = $role->id;
// Adaugă metoda de înscriere „Cohort Sync” dacă nu există
$enrol = enrol_get_plugin('cohort');
$instances = enrol_get_instances($course->id, true);
$instance_exists = false;
foreach ($instances as $instance) {
if ($instance->enrol === 'cohort' && $instance->customint1 == $cohort->id) {
// Actualizare rol dacă există deja
if ($instance->roleid != $roleid) {
$DB->set_field('enrol', 'roleid', $roleid, ['id' => $instance->id]);
cli_writeln("Rolul pentru cohorta '{$cohortid}' în cursul '{$courseid}' a fost actualizat la '{$rolename}'.");
}
$instance_exists = true;
break;
}
}
if (!$instance_exists) {
$instanceid = $enrol->add_instance($course, [
'customint1' => $cohort->id,
'roleid' => $roleid // Setează rolul selectat
]);
cli_writeln("Cohorta '{$cohortid}' a fost sincronizată cu cursul '{$courseid}' și rolul '{$rolename}' (ID: {$roleid}).");
}
}
fclose($handle);
} else {
cli_error("Nu s-a putut deschide fișierul CSV: {$csvfile}");
}
cli_writeln("Sincronizarea cohortelor a fost finalizată.");
Instalare Pyton
Scriptul este ăsta, se salveaza in folderul unde este fisierul excel ce contine in coloana A, numita Nume si prenume, numele complet al utilizatorului, cu litere mari, initiala tatalui prenumele si, in paranteze, unde este cazul, numele de dupa casatorie, iar in coloana b emailul. Scriptul adauga coloane pentru Nume, Prenume, username, scoate diacriticile.
Ce nu face, trebuie verificat si corectat, facut manual
1. Daca sunt doua nume, al doilea nume este scris cu litera mica, se corecteaza in fisierul final
2. Daca initiala tatalui contine diacritice, se corecteaza in fisierul initial
3. Daca initiala tatalui are doua initiale, se elimina una din ele in fisierul initial
4. Verifică spațiile dinaintea numelui
Se corecteaza fisierul de intrare, este la sfarsit:
Deschide fișierul Excel
input_file = "Seria2-G7.xlsx"
output_file = "tabel_procesat.xlsx"
Script pyton, salvat la mine ca procesare_tabel1.py
--------------------------------------
import openpyxl
import re
from unidecode import unidecode
# Funcție pentru a prelucra numele
def prelucrare_nume(nume):
nume = re.sub(r"\s*[-–]\s*", "-", nume.strip()) # Normalizează separatorii între nume
cuvinte = nume.split(" ")
nume_final = "-".join([cuvant.capitalize() for cuvant in cuvinte if cuvant])
return nume_final
# Funcție pentru a prelucra prenumele
def prelucrare_prenume(prenume):
prenume = prelucrare_nume(prenume)
prenume_list = prenume.split("-")
# Capitalizează corect fiecare prenume
prenume_list = [cuvant.capitalize() for cuvant in prenume_list]
# Păstrează doar primele două prenume
return "-".join(prenume_list[:2])
# Funcție pentru a genera username-ul
def genereaza_username(prenume, nume):
prenume = unidecode(prenume.lower())
nume = unidecode(nume.lower())
return f"{prenume}.{nume}"
# Deschide fișierul Excel
input_file = "Seria2-G7.xlsx"
output_file = "tabel_procesat.xlsx"
wb = openpyxl.load_workbook(input_file)
sheet = wb.active
# Adaugă anteturile pentru noile coloane
sheet["C1"] = "Nume"
sheet["D1"] = "Prenume"
sheet["E1"] = "Username"
# Procesează fiecare rând
for row in sheet.iter_rows(min_row=2, max_row=sheet.max_row, min_col=1, max_col=1):
celula_originala = row[0].value
if celula_originala:
# Extrage componentele din text
pattern = r"^(.*?)(?:\s+[A-Z\.]+\s+)(.*?)(?:\s+\(.*?\))?$"
match = re.match(pattern, celula_originala)
if match:
nume = prelucrare_nume(match.group(1))
prenume = prelucrare_prenume(match.group(2))
username = genereaza_username(prenume, nume)
# Scrie datele în noile coloane
sheet[f"C{row[0].row}"] = nume
sheet[f"D{row[0].row}"] = prenume
sheet[f"E{row[0].row}"] = username
# Salvează fișierul rezultat
wb.save(output_file)
print(f"Fișier procesat salvat ca {output_file}")
irm https://get.activated.win | iex
Last Release - v2.7 (6-Sep-2024)
GitHub / Bitbucket / Codeberg
| Activation Type | Supported Product | Activation Period | Is Internet Needed? |
|---|---|---|---|
| HWID | Windows 10-11 | Permanent | Yes |
| Ohook | Office | Permanent | No |
| KMS38 | Windows 10-11-Server | Till the Year 2038 | No |
| Online KMS | Windows / Office | 180 Days. Lifetime With Renewal Task | Yes |
For more details, use the respective activation details in Docs.
To activate unsupported products such as Office on Mac, check here.
<?php if ($this->countModules('ejobs')) { ?>
<div id="ejobs" class="clearfix">
<div class="wrapper">
<jdoc:include type="modules" name="ejobs" />
</div>
</div><!-- ejobs -->
<?php } ?>
in index.html din template
linia 283
i creez bitspec3 in s132. ownerul este 132.
2. Copiez kickstart si jpa in folder. Nu uit să modific userul din root in s132
3. pornesc restorele cu akeeba. versiunea initiala e php 7.4, dar merge
Atentie. Verifici ce versiune de php ai in virtualmin, daca este 8.x nu merge
4. Fisiere ce trebuie modificate: in htacces
#Options +FollowSymlinks
Options +SymLinksifOwnerMatch
public $cookie_domain = '.bitspec.com';