void XmlDataPersistance::loadCategories(const QString &fileName) { QFile file(fileName); if(!file.open(QIODevice::ReadOnly)) throw UTProfilerException("Failed to open " + fileName + " in UVManager::loadDegrees."); QDomDocument dom; dom.setContent(&file); QDomElement categories = dom.documentElement(); for(QDomElement catElem = categories.firstChildElement("categorie");!catElem.isNull();catElem = catElem.nextSiblingElement("categorie")) { Uv::categories_.push_back(catElem.text()); } file.close(); }
//Chargement de toutes les uvs en mémoire si aucun paramètre, sinon juste l'UV dont le code est envoyé void UVManager::load() { bool automne; bool printemps; QString code; QString titre; //Categorie categorie QMap<QString,int> cat; int nombre_select = 0; QSqlQuery* query; DatabaseManager& dbu=DatabaseManager::getInstanceDB(); query = new QSqlQuery("SELECT * FROM UV_table",dbu.getMyDB()); while(query->next()) { nombre_select++; automne = query->value(0).toBool(); printemps = query->value(1).toBool(); code = query->value(2).toString(); titre = query->value(3).toString(); cat.insert("CS",query->value(4).toInt()); cat.insert("TM",query->value(5).toInt()); cat.insert("TSH",query->value(6).toInt()); cat.insert("SP",query->value(7).toInt()); ajouterUV(code,titre,cat,automne,printemps); } std::cout<<nombre_select<<"\n"; if(nombre_select == 0) { throw UTProfilerException("Erreur au chargement, l'UV n'existe pas"); } }
bool EtudiantDAO::update(Etudiant *obj){ try{ QSqlQuery query(Connexion::getInstance()->getDataBase()); query.prepare("UPDATE etudiants SET (login=:login, prenom=:prenom, nom=:nom) WHERE id = :id ;"); query.bindValue(":id", obj->ID()); query.bindValue(":login", obj->getLogin() ); query.bindValue(":prenom", obj->getPrenom() ); query.bindValue(":nom", obj->getNom() ); if (!query.exec()){ throw UTProfilerException("La requète a échoué : " + query.lastQuery()); return false; }else{ LogWriter::writeln("EtudiantDAO.cpp","Lecture de l'étudiant : " + obj->getLogin()); return true; } }catch(UTProfilerException e){ LogWriter::writeln("EtudiantDAO::update()",e.getMessage()); } }
Semester* Semester::getInstance(Season s, unsigned int a){ if(semesters == 0){ semesters = new std::vector<Semester*>(); } if(a > 99){ throw UTProfilerException("(Semester) Invalid year !"); return 0; } for(std::vector<Semester*>::iterator it = semesters->begin(); it != semesters->end(); ++it){ if((*it)->toStdString() == SeasonNames[s]+QString::number(a).toStdString()){ return *it; } } Semester* n = new Semester(s, a); semesters->push_back(n); return n; }
bool EtudiantDAO::create(Etudiant *obj){ try{ QSqlQuery query(Connexion::getInstance()->getDataBase()); query.prepare("INSERT INTO etudiants (id, login, prenom, nom) VALUES (NULL, :login, :prenom, :nom);"); query.bindValue(":login", obj->getLogin() ); query.bindValue(":prenom", obj->getPrenom() ); query.bindValue(":nom", obj->getNom() ); if (!query.exec()){ throw UTProfilerException("La requète a échoué : " + query.lastQuery()); return false; }else{ int id = query.lastInsertId().toInt(); obj->setID(id); Map.insert(id,obj); LogWriter::writeln("Etudiant.cpp","Création de l'étudiant : " + obj->getLogin()); return true; } }catch(UTProfilerException e){ LogWriter::writeln("EtudiantDAO::create()",e.getMessage()); } }
Etudiant* EtudiantDAO::find(const int& id){ try{ if (Map.contains(id)) { return Map.value(id); } QSqlQuery query(Connexion::getInstance()->getDataBase()); if (!query.exec("SELECT * FROM etudiants WHERE id = " + QString::number(id) + ";")){ throw UTProfilerException("La requète a échoué : " + query.lastQuery()); } if(query.first()){ QSqlRecord rec = query.record(); const QString l = rec.value("login").toString(); const QString p = rec.value("prenom").toString(); const QString n = rec.value("nom").toString(); LogWriter::writeln("EtudiantDAO.cpp","Lecture de l'étudiant : " + l); Etudiant* etu = new Etudiant(id,l,p,n); Map.insert(id,etu); return etu; } }catch(UTProfilerException e){ LogWriter::writeln("EtudiantDAO::find()",e.getMessage()); } }
UV& UVManager::getUV(const QString& code){ UV* uv=trouverUV(code); if (!uv) throw UTProfilerException("erreur, UVManager, UV inexistante",__FILE__,__LINE__); return *uv; }
void formationManager::load(const QString& f){ if (!formations.isEmpty()) { deleteAllFormations(); } file=f; QFile fin(file); // If we can't open it, let's show an error message. if (!fin.open(QIODevice::ReadOnly | QIODevice::Text)) { throw UTProfilerException("Erreur ouverture fichier formations"); } // QXmlStreamReader takes any QIODevice. QXmlStreamReader xml(&fin); // We'll parse the XML until we reach end of it. while(!xml.atEnd() && !xml.hasError()) { // Read next element. QStringRef test; QXmlStreamReader::TokenType token = xml.readNext(); test = xml.name(); // If token is just StartDocument, we'll go to next. if(token == QXmlStreamReader::StartDocument) continue; // If token is StartElement, we'll see if we can read it. if(token == QXmlStreamReader::StartElement) { // If it's named formations, we'll go to the next. if(xml.name() == "formations") continue; // If it's named formation, we'll dig the information from there. if(xml.name() == "formation") { QString code; QString titre; QMap<QString, int> creditsNeeded; QSet<QString> formationsNeeded; QSet<QString> uvNeeded; CreditsInUV creditsNeededInUVSet; xml.readNext(); //We're going to loop over the things because the order might change. //We'll continue the loop until we hit an EndElement named formation. while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == "formation")) { if(xml.tokenType() == QXmlStreamReader::StartElement) { // We've found code. if(xml.name() == "code") { xml.readNext(); code=xml.text().toString(); } // We've found titre. if(xml.name() == "titre") { xml.readNext(); titre=xml.text().toString(); } // We've found creditsNeeded. if(xml.name() == "creditsNeeded") { QString cat; int nbC; QXmlStreamAttributes attributes = xml.attributes(); foreach (QXmlStreamAttribute attribute, attributes) { cat=attribute.name().toString(); nbC=attribute.value().toInt(); creditsNeeded.insert(cat, nbC); if (!UVManager::getInstance().getCategorieManager().getAllCategories().contains(cat)) { UVManager::getInstance().getCategorieManager().addItem(cat, ""); } } } // We've found formationNeeded. if(xml.name() == "formationNeeded") { xml.readNext(); formationsNeeded.insert(xml.text().toString()); } if(xml.name() == "uvNeeded") { xml.readNext(); uvNeeded.insert(xml.text().toString()); } if(xml.name() == "creditsNeededInUVSet") { QString cat; int nbC; QMap<QString, int> credits; QSet<QString> uvs; QXmlStreamAttributes attributes = xml.attributes(); foreach (QXmlStreamAttribute attribute, attributes) { cat=attribute.name().toString(); nbC=attribute.value().toInt(); credits.insert(cat, nbC); if (!UVManager::getInstance().getCategorieManager().getAllCategories().contains(cat)) { UVManager::getInstance().getCategorieManager().addItem(cat, ""); } } xml.readNext(); while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == "creditsNeededInUVSet")) { if(xml.tokenType() == QXmlStreamReader::StartElement) { if(xml.name() == "uv") { xml.readNext(); uvs.insert(xml.text().toString()); } } xml.readNext(); } creditsNeededInUVSet.credits=credits; creditsNeededInUVSet.uvs=uvs; } }
void DossierEditeur::ajouterInscription() { try { QDialog* window = new QDialog(this); QGridLayout* lay = new QGridLayout; QPushButton* ok = new QPushButton("Ok"); QComboBox *ListeUV= new QComboBox(this); QComboBox *ListeCursus= new QComboBox(this); QComboBox *ListeResultat= new QComboBox(this); QComboBox *ListeSaison= new QComboBox(this); QLineEdit *Annee= new QLineEdit(this); QLabel* UVLabel= new QLabel("UV : ",this); QLabel* cursusLabel= new QLabel("Cursus : ",this); QLabel* resultatLabel= new QLabel("Note : ",this); QLabel* saisonLabel= new QLabel("Saison : ",this); QLabel* anneeLabel = new QLabel("Année : ",this); window->setFixedSize(300, 400); UV** uvs = UVManager::getInstance().getUVs(); for(unsigned int i=0;i<UVManager::getInstance().getNbUV(); i++) { ListeUV->addItem(uvs[i]->getCode()); } for(Note n = first; n <= last; n = Note(n+1)) ListeResultat->addItem(NoteToString(n)); for(int i = 0; i < FormationManager::getInstance().getTaille(); i++) ListeCursus->addItem(FormationManager::getInstance().getElement(i).getCode()); ListeSaison->addItem("Automne"); ListeSaison->addItem("Printemps"); lay->addWidget(UVLabel,0,0); lay->addWidget(cursusLabel,1,0); lay->addWidget(resultatLabel,2,0); lay->addWidget(saisonLabel,3,0); lay->addWidget(anneeLabel,4,0); lay->addWidget(ListeUV,0,1); lay->addWidget(ListeCursus,1,1); lay->addWidget(ListeResultat,2,1); lay->addWidget(ListeSaison,3,1); lay->addWidget(Annee,4,1); lay->addWidget(ok,5,1,Qt::AlignHCenter); window->setLayout(lay); connect(ok,SIGNAL(clicked()),window,SLOT(accept())); window->exec(); if(window->result()) { if(Annee->text().isEmpty()) throw UTProfilerException("Ne laissez pas l'année vide !"); UV& uv = UVManager::getInstance().getUV(ListeUV->currentText()); Semestre s(StringToSaison(ListeSaison->currentText()),Annee->text().toUInt()); Dossier::getInstance().ajouterInscription(uv,StringToNote(ListeResultat->currentText()),s,ListeCursus->currentText()); QMessageBox::information(this,"Ajout d'une inscription", QString("Ajout de la catégorie ")+ListeUV->currentText()+" réussie."); dossier->setRowCount(Dossier::getInstance().getTaille()); QTableWidgetItem *monItem = new QTableWidgetItem(ListeUV->currentText()); dossier->setItem(Dossier::getInstance().getTaille() -1,0,monItem); monItem = new QTableWidgetItem(s.FormeContracte()); dossier->setItem(Dossier::getInstance().getTaille() -1,1,monItem); monItem = new QTableWidgetItem(ListeResultat->currentText()); dossier->setItem(Dossier::getInstance().getTaille() -1,2,monItem); monItem = new QTableWidgetItem(ListeCursus->currentText()); dossier->setItem(Dossier::getInstance().getTaille() -1,3,monItem); } } catch(UTProfilerException& e) { QMessageBox::warning(this, "Ajout d'inscription", e.getInfo()); } }
/*! * \brief Sauvegarde les dossiers en mémoire dans le fichier dossiers.xml */ void DossierManager::save(){ file=QDir::currentPath()+"/dossiers.xml"; try{ QFile newfile(file); if (!newfile.open(QIODevice::WriteOnly | QIODevice::Text)) throw UTProfilerException(QString("erreur ouverture fichier xml")); QXmlStreamWriter stream(&newfile); stream.setAutoFormatting(true); stream.writeStartDocument(); stream.writeStartElement("dossiers"); for(unsigned int i=0; i<nbDos; i++){ stream.writeStartElement("dossier"); QString n; n.setNum(tabDossiers[i]->getNumero()); stream.writeTextElement("numero",n); stream.writeTextElement("nom",tabDossiers[i]->getNom()); stream.writeTextElement("prenom",tabDossiers[i]->getPrenom()); stream.writeTextElement("formation",tabDossiers[i]->getFormation()); stream.writeTextElement("filiere",tabDossiers[i]->getFiliere()); stream.writeTextElement("semestre",QString::number(tabDossiers[i]->getNumSemestre())); //ecriture des UV unsigned int j=0; stream.writeStartElement("uvs"); for(QMap<QString,Note>::iterator it=tabDossiers[i]->getQmapIteratorUVbegin();it!=tabDossiers[i]->getQmapIteratorUVend(); it++) { stream.writeTextElement("uv",it.key()); //ecriture du resultat correspondant stream.writeTextElement("result", Note2String(it.value())); j++; } stream.writeEndElement(); //ecriture des equivalences unsigned int k=0; Equivalences** tab=tabDossiers[i]->getEquivalences(); stream.writeStartElement("equivalences"); while (tab[k]!=0) { stream.writeStartElement("equivalence"); stream.writeTextElement("type", tab[k]->getType()); QString n; n.setNum(tab[k]->getNbCredits()); stream.writeTextElement("credits", n); stream.writeTextElement("description", tab[k]->getDescription()); stream.writeEndElement(); k++; } stream.writeEndElement(); stream.writeStartElement("souhaits"); if(tabDossiers[i]->Souhaits!=0) { stream.writeTextElement("dossier",QString::number(tabDossiers[i]->getNumero())); stream.writeStartElement("exigees"); for(QSet<QString>::iterator it=tabDossiers[i]->Souhaits->exigences.begin();it!=tabDossiers[i]->Souhaits->exigences.end();it++) { stream.writeTextElement("uv",*it); } stream.writeEndElement(); stream.writeStartElement("preferees"); for(QSet<QString>::iterator it=tabDossiers[i]->Souhaits->preferences.begin();it!=tabDossiers[i]->Souhaits->preferences.end();it++) { stream.writeTextElement("uv",*it); } stream.writeEndElement(); stream.writeStartElement("rejetees"); for(QSet<QString>::iterator it=tabDossiers[i]->Souhaits->rejets.begin();it!=tabDossiers[i]->Souhaits->rejets.end();it++) { stream.writeTextElement("uv",*it); } stream.writeEndElement(); } stream.writeEndElement(); stream.writeEndElement(); } stream.writeEndElement(); stream.writeEndDocument(); newfile.close(); } catch(UTProfilerException& e){QMessageBox::warning(0,"Erreur",e.getInfo());} }
/*! * \brief Récupère les dossiers sauvegardés dans le fichiers dossiers.xml et les charge en mémoire. */ void DossierManager::load() { try{ file=QDir::currentPath()+"/dossiers.xml"; QFile f(file); if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) {throw UTProfilerException("Erreur ouverture fichier cursus");} QXmlStreamReader xml(&f); while(!xml.atEnd() && !xml.hasError()) { QXmlStreamReader::TokenType token = xml.readNext(); if(token == QXmlStreamReader::StartDocument) continue; if(token == QXmlStreamReader::StartElement) { if(xml.name() == "dossiers") continue; if(xml.name() == "dossier") { unsigned int numero; QString nom; QString prenom; QString formation; QString filiere; unsigned int numSemestre; QStringList listUV; QStringList listResult; //pour les equivalences : unsigned int credits= 6; QString description="lala";//valeur pour test du update : fonctionne QString type="Semestre" ; unsigned int nb=0; Equivalences ** tab=new Equivalences*[5]; for (unsigned int j=0; j<5; j++) tab[j]=0; //pour les souhaits QSet<QString> exigees; QSet<QString> preferees; QSet<QString> rejetees; xml.readNext(); while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == "dossier")) { if(xml.tokenType() == QXmlStreamReader::StartElement) { if(xml.name() == "numero") { xml.readNext(); numero=xml.text().toString().toUInt(); } if(xml.name() == "nom") { xml.readNext(); nom=xml.text().toString(); } if(xml.name() == "prenom") { xml.readNext(); prenom=xml.text().toString(); } if(xml.name() == "formation") { xml.readNext(); formation=xml.text().toString(); } if(xml.name() == "filiere") { xml.readNext(); filiere=xml.text().toString(); } if(xml.name() == "semestre") { xml.readNext(); numSemestre=xml.text().toUInt(); } if(xml.name() == "uvs") { unsigned int nbUVs=0; xml.readNext(); while(!(xml.tokenType()==QXmlStreamReader::EndElement && xml.name()=="uvs")) { if(xml.tokenType()==QXmlStreamReader::StartElement && xml.name()=="uv") { nbUVs++; xml.readNext(); listUV<<xml.text().toString(); } if(xml.tokenType()==QXmlStreamReader::StartElement && xml.name()=="result") { xml.readNext(); listResult<<xml.text().toString(); } xml.readNext(); } ajouterDossier(numero,nom, prenom, formation, filiere, numSemestre); }//fin if pour uv if(xml.name() == "equivalences") { while(!(xml.tokenType()==QXmlStreamReader::EndElement && xml.name()=="equivalences")) { if(xml.name() == "equivalence") { xml.readNext(); while(!(xml.tokenType()==QXmlStreamReader::EndElement && xml.name()=="equivalence")) { if(xml.tokenType()==QXmlStreamReader::StartElement && xml.name()=="type") { xml.readNext(); type=xml.text().toString(); } if(xml.tokenType()==QXmlStreamReader::StartElement && xml.name()=="credits") { xml.readNext(); credits=xml.text().toUInt(); } if(xml.tokenType()==QXmlStreamReader::StartElement && xml.name()=="description") { xml.readNext(); description=xml.text().toString(); } xml.readNext(); } tab[nb]=new Equivalences(type, credits, description); nb++; } xml.readNext(); } } if(xml.name()=="souhaits") { qDebug()<<"Chargement souhaits"; while(!(xml.tokenType()==QXmlStreamReader::EndElement && xml.name()=="souhaits")) { if(xml.name()=="exigees") { xml.readNext(); while(!(xml.tokenType()==QXmlStreamReader::EndElement && xml.name()=="exigees")) { if(xml.name()=="uv") { xml.readNext(); exigees.insert(xml.text().toString()); xml.readNext(); } xml.readNext(); } } if(xml.name()=="preferees") { xml.readNext(); while(!(xml.tokenType()==QXmlStreamReader::EndElement && xml.name()=="preferees")) { if(xml.name()=="uv") { xml.readNext(); preferees.insert(xml.text().toString()); xml.readNext(); } xml.readNext(); } } if(xml.name()=="rejetees") { xml.readNext(); while(!(xml.tokenType()==QXmlStreamReader::EndElement && xml.name()=="rejetees")) { if(xml.name()=="uv") { xml.readNext(); rejetees.insert(xml.text().toString()); xml.readNext(); } xml.readNext(); } } xml.readNext(); } } } xml.readNext(); } Dossier* d=trouverDossier(numero); if(!listUV.empty()) { visiteur2* v=new visiteur2(numero,listUV,listResult); v->visitUVmanager(); this->accept(v); } d->setNbEquivalences(nb); d->setEquivalences(tab); tab=d->getEquivalences(); souhaits* newsouhait=new souhaits(d,exigees,preferees,rejetees); d->setSouhaits(newsouhait); } } } if(xml.hasError()) { throw UTProfilerException("Erreur lecteur fichier dossier, parser xml"); } xml.clear(); } catch(UTProfilerException& e){QMessageBox::warning(0,"Erreur",e.getInfo());} }
void UVEditorController::on_UVTableView_doubleClicked(const QModelIndex &index) { if(index.column() == 0){ UTProfilerException(uiUVEditor->exceptionLabel_main, "UV code isn't editable !"); } }
void UVEditorController::uvToUpdate_dataChanged(QModelIndex x ,QModelIndex y){ const std::vector<UV*>* uvs = uv_accessDB->getAll(); bool modified; // column 0 : code isn't modifiable if(x.column() == 1){ QString title = x.data().toString(); if(title.size() <= 50){ modified = true; } else UTProfilerException(uiUVEditor->exceptionLabel_main, "Maximum length is 50 characters."); } else if(x.column() == 2){ QString descr = x.data().toString(); if(descr.size() <= 500){ modified = true; } else UTProfilerException(uiUVEditor->exceptionLabel_main, "Maximum length is 500 characters."); } else if(x.column() == 3){ bool ok; int nbCredits = x.data().toString().toInt(&ok,10); if(ok && nbCredits <= 60){ modified = true; } else UTProfilerException(uiUVEditor->exceptionLabel_main, "Maximum credits for one UV is 60."); } else if(x.column() == 4){ std::string category = x.data().toString().toStdString(); // get category int i=-1; while(category != CategoryNames[++i] && i<=3); if(i<=3){ modified = true; } else UTProfilerException(uiUVEditor->exceptionLabel_main, "Categories are CS, TM, TSH or SP."); } if(!modified){ QObject::disconnect(uv_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(uvToUpdate_dataChanged(QModelIndex,QModelIndex)) ); if(x.row() < uvs->size()){ // existing UV in DB uv_model->item(x.row(), 0)->setText(uvs->at(x.row())->getCode().c_str()); uv_model->item(x.row(), 1)->setText(uvs->at(x.row())->getTitle().c_str()); uv_model->item(x.row(), 2)->setText(uvs->at(x.row())->getDescription().c_str()); uv_model->item(x.row(), 3)->setText(QString::number(uvs->at(x.row())->getNbCredits())); uv_model->item(x.row(), 4)->setText(CategoryNames[uvs->at(x.row())->getCategory()]); } else{ // New UV in DB uv_model->item(x.row(), 0)->setText(uvs->at(x.row()-uvs->size())->getCode().c_str()); uv_model->item(x.row(), 1)->setText(uvs->at(x.row()-uvs->size())->getTitle().c_str()); uv_model->item(x.row(), 2)->setText(uvs->at(x.row()-uvs->size())->getDescription().c_str()); uv_model->item(x.row(), 3)->setText(QString::number(uvs->at(x.row()-uvs->size())->getNbCredits())); uv_model->item(x.row(), 4)->setText(CategoryNames[uvs->at(x.row()-uvs->size())->getCategory()]); } QObject::connect(uv_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(uvToUpdate_dataChanged(QModelIndex,QModelIndex))); } else{ std::string category = uv_model->item(x.row(), 4)->text().toStdString(); int i=-1; while(category != CategoryNames[++i] && i<=3); Category cat = static_cast<Category>(i); // Is the UV already modified ? std::vector<UV>::iterator it; for(it = modifiedUVs->begin(); it != modifiedUVs->end() && it->getCode() != uv_model->item(x.row(), 0)->text().toStdString(); ++it){ } if(it == modifiedUVs->end()) modifiedUVs->push_back(UV(uv_model->item(x.row(), 0)->text().toStdString(), uv_model->item(x.row(), 1)->text().toStdString(), uv_model->item(x.row(), 2)->text().toStdString(), uv_model->item(x.row(), 3)->text().toInt(), cat )); else { it->setTitle(uv_model->item(x.row(), 1)->text().toStdString()); it->setDescription(uv_model->item(x.row(), 2)->text().toStdString()); it->setNbCredits(uv_model->item(x.row(), 3)->text().toInt()); it->setCategory(uv_model->item(x.row(), 4)->text().toStdString()); } } }
void XmlDataPersistance::loadStudents(const QString &studentsFileName) { QFile file(studentsFileName); if(!file.open(QIODevice::ReadOnly)) throw UTProfilerException("Failed to open " + studentsFileName + " in UVManager::loadStudents."); QDomDocument dom; dom.setContent(&file); QDomElement students = dom.documentElement(); for(QDomElement studentElement = students.firstChildElement("etudiant"); !studentElement.isNull(); studentElement = studentElement.nextSiblingElement("etudiant")) { Student* student = new Student; student->setLogin(studentElement.firstChildElement("login").text()); student->setFirstName(studentElement.firstChildElement("prenom").text()); student->setLastName(studentElement.firstChildElement("nom").text()); addDegrees(student, studentElement); // load degrees addSemesters(student, studentElement); // load semsters and uvs for(QDomElement eqElem = studentElement.firstChildElement("equivalence");!eqElem.isNull();eqElem = eqElem.nextSiblingElement("equivalence")) { student->setEquivalence(eqElem.attribute("categorie"),eqElem.text().toUInt()); } students_.push_back(student); // Previsions for(QDomElement expElem = studentElement.firstChildElement("prevision"); !expElem.isNull(); expElem = expElem.nextSiblingElement("prevision")) { Expectation* exp = new Expectation; exp->setName(expElem.firstChildElement("nom").text()); student->addExp(exp); for(QDomElement degreeElement = expElem.firstChildElement("cursus"); !degreeElement.isNull(); degreeElement = degreeElement.nextSiblingElement("cursus")) { for(int i = 0; i < degrees_.size(); i++) { if(degrees_.at(i)->title() == degreeElement.text()) exp->addDegree(degrees_.at(i)); } } for(QDomElement uvElement = expElem.firstChildElement("uvRejete"); !uvElement.isNull(); uvElement = uvElement.nextSiblingElement("uvRejete")) { const Uv *uv = uvFromCode(uvElement.text()); if(uv) exp->addRejectedUv(uv); } for(QDomElement uvElement = expElem.firstChildElement("uvRequise"); !uvElement.isNull(); uvElement = uvElement.nextSiblingElement("uvRequise")) { const Uv *uv = uvFromCode(uvElement.text()); if(uv) exp->addRequiredUv(uv); } for(QDomElement semesterElement = expElem.firstChildElement("semestre"); !semesterElement.isNull(); semesterElement = semesterElement.nextSiblingElement("semestre")) { Semester *semester = new Semester(); semester->setTitle(semesterElement.firstChildElement("titre").text()); for(QDomElement uvElement = semesterElement.firstChildElement("uv"); !uvElement.isNull(); uvElement = uvElement.nextSiblingElement("uv")) { semester->addUv(uvElement.text(), Uv::stringToGrade("Undefined")); } exp->addSemester(semester); } } } file.close(); }