Projektabgabe Uebersicht: added zip download, bugfixes Projektabgabe search

This commit is contained in:
Alexei Karpenko
2025-11-05 11:44:36 +01:00
parent 601c6c53e7
commit bd67e41aa6
4 changed files with 99 additions and 137 deletions
@@ -14,7 +14,6 @@
if (!defined('BASEPATH')) exit('No direct script access allowed');
class PaabgabeUebersicht extends FHCAPI_Controller
{
const DOWNLOAD_PERMISSION = 'lehre/abgabetool:download';
@@ -26,16 +25,22 @@ class PaabgabeUebersicht extends FHCAPI_Controller
public function __construct()
{
parent::__construct([
'getStudiengaenge' => array('lehre/abgabetool:r'),
'getPaAbgaben' => array('lehre/abgabetool:r'),
'getStudiengaenge' => array('lehre/abgabetool:r'),
'getTermine' => array('lehre/abgabetool:r'),
'getPaAbgabetypen' => array('lehre/abgabetool:r')
'getPaAbgabetypen' => array('lehre/abgabetool:r'),
'downloadZip' => array('lehre/abgabetool:r')
//'downloadProjektarbeit' => array('lehre/abgabetool:r')
]);
$this->load->model('education/Paabgabe_model', 'PaabgabeModel');
$this->load->library('PermissionLib');
// Load Phrases
$this->loadPhrases([
'abgabetool'
]);
}
/**
@@ -50,32 +55,13 @@ class PaabgabeUebersicht extends FHCAPI_Controller
$abgabedatum = $this->input->get('abgabedatum');
$personSearchString = $this->input->get('personSearchString');
$result = $this->PaabgabeModel->getPaAbgaben(self::ABGABE_TYPES, $studiengang_kz, $abgabetyp_kurzbz, $abgabedatum, $personSearchString);
$this->addMeta('res', $result);
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
$this->terminateWithSuccess(getData($result) ?: []);
}
/**
*
*
* @return array|stdClass|null
*/
//~ public function searchPaAbgabenByPerson()
//~ {
//~ $searchString = $this->input->get('searchString');
//~ $result = $this->PaabgabeModel->searchPaAbgabenByPerson(self::ABGABE_TYPES, $searchString);
//~ $this->addMeta('res', $result);
//~ if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
//~ $this->terminateWithSuccess(getData($result) ?: []);
//~ }
/**
*
*
@@ -99,7 +85,6 @@ class PaabgabeUebersicht extends FHCAPI_Controller
$this->terminateWithSuccess((getData($result) ?: []));
}
/**
*
*
@@ -127,6 +112,7 @@ class PaabgabeUebersicht extends FHCAPI_Controller
// Load model PaabgabetypModel
$this->load->model('education/Paabgabetyp_model', 'PaabgabetypModel');
$this->PaabgabetypModel->addOrder('bezeichnung');
$result = $this->PaabgabetypModel->load();
if (isError($result)) $this->terminateWithError(getError($result), self::ERROR_TYPE_DB);
@@ -134,6 +120,52 @@ class PaabgabeUebersicht extends FHCAPI_Controller
$this->terminateWithSuccess((getData($result) ?: []));
}
/**
*
* @param
* @return object success or error
*/
public function downloadZip()
{
$studiengang_kz = $this->input->get('studiengang_kz');
$abgabetyp_kurzbz = $this->input->get('abgabetyp_kurzbz');
$abgabedatum = $this->input->get('abgabedatum');
$personSearchString = $this->input->get('personSearchString');
if (!isset($studiengang_kz) && !isset($abgabetyp_kurzbz) && !isset($abgabedatum) && !isset($personSearchString))
$this->terminateWithFileOutput('text/plain', $this->p->t('abgabetool', 'keineAuswahl'));
$this->load->library('zip');
$result = $this->PaabgabeModel->getPaAbgaben(self::ABGABE_TYPES, $studiengang_kz, $abgabetyp_kurzbz, $abgabedatum, $personSearchString);
if (isError($result)) $this->terminateWithFileOutput('text/plain', getError($result));
$fileExists = false;
$studiengang_kuerzel = null;
if (!hasData($result)) $this->terminateWithFileOutput('text/plain', $this->p->t('abgabetool', 'keineDateienVorhanden'));
$abgaben = getData($result);
foreach ($abgaben as $abgabe)
{
$path = PAABGABE_PATH.$abgabe->paabgabe_id.'_'.$abgabe->uid.'.pdf';
if (file_exists($path))
{
$fileExists = true;
$studiengang_kuerzel = $abgabe->studiengang_kuerzel;
$this->zip->read_file($path);
}
}
if (!$fileExists) $this->terminateWithFileOutput('text/plain', $this->p->t('abgabetool', 'keineDateienVorhanden'));
$studiengang_kz = $this->input->get('studiengang_kz');
$zipFileName = 'Abgabe'.(isset($studiengang_kz) && isset($studiengang_kuerzel) ? '_'.$studiengang_kuerzel : '').'.zip';
$this->zip->download($zipFileName);
}
/**
* Download Projektarbeit document.
*/
+15 -86
View File
@@ -67,34 +67,25 @@ class Paabgabe_model extends DB_Model
$abgabetyp_kurzbz = null,
$abgabedatum = null,
$personSearchString = null,
$limit = 100
$limit = 1000
) {
// convert search string
if (is_numeric($personSearchString))
{
$personSearchString = (int) $personSearchString;
}
else
{
// remove empty spaces and lowercase
$personSearchString = strtolower(str_replace(' ', '', $personSearchString));
}
$params = [];
$qry = "
SELECT
tbl_studiengang.bezeichnung AS stgbez, tbl_paabgabe.datum AS termin,
tbl_paabgabe.*, abgabetyp.bezeichnung AS paabgabetyp_bezeichnung, ben.uid, pers.vorname, pers.nachname, pa.projekttyp_kurzbz, pa.titel
stg.bezeichnung AS stgbez, paabg.datum AS termin,
paabg.paabgabe_id, paabg.projektarbeit_id, paabg.paabgabetyp_kurzbz, paabg.abgabedatum,
abgabetyp.bezeichnung AS paabgabetyp_bezeichnung, ben.uid, pers.vorname, pers.nachname, pa.projekttyp_kurzbz, pa.titel,
UPPER(stg.typ || stg.kurzbz) AS studiengang_kuerzel
FROM
lehre.tbl_projektarbeit pa
JOIN campus.tbl_paabgabe USING(projektarbeit_id)
JOIN campus.tbl_paabgabe paabg USING(projektarbeit_id)
JOIN campus.tbl_paabgabetyp abgabetyp USING(paabgabetyp_kurzbz)
LEFT JOIN public.tbl_benutzer ben ON(uid=student_uid)
LEFT JOIN public.tbl_person pers ON(ben.person_id=pers.person_id)
LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
LEFT JOIN public.tbl_studiengang stg USING(studiengang_kz)
WHERE
TRUE";
@@ -106,24 +97,25 @@ class Paabgabe_model extends DB_Model
if (isset($studiengang_kz) && is_numeric($studiengang_kz))
{
$qry .= " AND public.tbl_studiengang.studiengang_kz=?";
$qry .= " AND stg.studiengang_kz=?";
$params[] = $studiengang_kz;
}
if (isset($abgabetyp_kurzbz))
{
$qry .= " AND campus.tbl_paabgabe.paabgabetyp_kurzbz=?";
$qry .= " AND paabg.paabgabetyp_kurzbz=?";
$params[] = $abgabetyp_kurzbz;
}
if (isset($abgabedatum))
{
$qry .= " AND campus.tbl_paabgabe.datum=?";
$qry .= " AND paabg.datum=?";
$params[] = $abgabedatum;
}
if (is_integer($personSearchString))
if (is_numeric($personSearchString))
{
$personSearchString = (int) $personSearchString;
$params = array_merge($params, [$personSearchString, $personSearchString]);
$qry .= " AND (
pers.person_id = ?
@@ -132,6 +124,8 @@ class Paabgabe_model extends DB_Model
}
elseif (is_string($personSearchString))
{
// remove empty spaces and lowercase
$personSearchString = strtolower(str_replace(' ', '', $personSearchString));
$qry .= " AND (
LOWER(REPLACE(pers.nachname || pers.vorname || pers.nachname, ' ', '')) LIKE ".$this->db->escape('%'.$personSearchString.'%')."
OR ben.uid LIKE ".$this->db->escape('%'.$personSearchString.'%')."
@@ -140,9 +134,7 @@ class Paabgabe_model extends DB_Model
$qry .= " ORDER BY nachname";
if (isset($limit) && is_numeric($limit)
&& (!isset($studiengang_kz) || !is_numeric($studiengang_kz))
&& !isset($abgabetyp_kurzbz) && !isset($abgabedatum))
if (isset($limit) && is_numeric($limit) && (!isset($studiengang_kz) || !is_numeric($studiengang_kz)) && !isset($abgabedatum))
{
$qry .= " LIMIT ?";
$params[] = $limit;
@@ -191,67 +183,4 @@ class Paabgabe_model extends DB_Model
return $this->execReadOnlyQuery($qry, $params);
}
//~ public function searchPaAbgabenByPerson($projekttyp_kurzbz_arr, $searchString, $limit = 100)
//~ {
//~ if (is_numeric($searchString))
//~ {
//~ $searchString = (int) $searchString;
//~ }
//~ else
//~ {
//~ $searchString = strtolower(str_replace(' ', '', $searchString));
//~ }
//~ $params = [];
//~ $qry = "
//~ SELECT
//~ tbl_studiengang.bezeichnung AS stgbez, tbl_paabgabe.datum AS termin,
//~ tbl_paabgabe.*, abgabetyp.bezeichnung AS paabgabetyp_bezeichnung, ben.uid, pers.vorname, pers.nachname, pa.projekttyp_kurzbz, pa.titel
//~ FROM
//~ lehre.tbl_projektarbeit pa
//~ JOIN campus.tbl_paabgabe USING(projektarbeit_id)
//~ JOIN campus.tbl_paabgabetyp abgabetyp USING(paabgabetyp_kurzbz)
//~ LEFT JOIN public.tbl_benutzer ben ON(uid=student_uid)
//~ LEFT JOIN public.tbl_person pers ON(ben.person_id=pers.person_id)
//~ LEFT JOIN lehre.tbl_lehreinheit USING(lehreinheit_id)
//~ LEFT JOIN lehre.tbl_lehrveranstaltung USING(lehrveranstaltung_id)
//~ LEFT JOIN public.tbl_studiengang USING(studiengang_kz)
//~ WHERE
//~ TRUE";
//~ if (isset($projekttyp_kurzbz_arr) && !isEmptyArray($projekttyp_kurzbz_arr))
//~ {
//~ $qry .= " AND projekttyp_kurzbz IN ?";
//~ $params[] = $projekttyp_kurzbz_arr;
//~ }
//~ if (is_integer($searchString))
//~ {
//~ $params = array_merge($params, [$searchString, $searchString]);
//~ $qry .= " AND (
//~ pers.person_id = ?
//~ OR EXISTS (SELECT 1 FROM public.tbl_prestudent WHERE person_id = pers.person_id AND prestudent_id = ?)
//~ )";
//~ }
//~ else
//~ {
//~ $qry .= " AND (
//~ LOWER(REPLACE(pers.nachname || pers.vorname || pers.nachname, ' ', '')) LIKE ".$this->db->escape('%'.$searchString.'%')."
//~ OR ben.uid LIKE ".$this->db->escape('%'.$searchString.'%')."
//~ )";
//~ }
//~ $qry .= " ORDER BY nachname";
//~ if (isset($limit) && is_numeric($limit))
//~ {
//~ $qry .= " LIMIT ?";
//~ $params[] = $limit;
//~ }
//~ return $this->execReadOnlyQuery($qry, $params);
//~ }
}
@@ -8,13 +8,6 @@ export default {
}
};
},
//~ searchPaAbgabenByPerson(searchString) {
//~ return {
//~ method: 'get',
//~ url: '/api/frontend/v1/education/PaabgabeUebersicht/searchPaAbgabenByPerson',
//~ params: { searchString: searchString }
//~ };
//~ },
getStudiengaenge() {
return {
method: 'get',
@@ -1,5 +1,4 @@
import {CoreFilterCmpt} from "../../../components/filter/Filter.js";
import VueDatePicker from '../../vueDatepicker.js.php';
import ApiPaabgabe from '../../../api/factory/paabgabeUebersicht.js'
import Loader from "../../Loader.js";
@@ -9,7 +8,6 @@ export const ProjektabgabeUebersicht = {
viewData: Object // NOTE: this is inherited from router-view
},
components: {
VueDatePicker,
CoreFilterCmpt,
Loader
},
@@ -115,7 +113,7 @@ export const ProjektabgabeUebersicht = {
tableResolve(resolve) {
this.tableBuiltResolve = resolve
},
setupData(data){
setupData(){
//~ const d = data.map(paabgabe => {
//~ return {
//~ ort_kurzbz: paabgabe.ort_kurzbz,
@@ -125,7 +123,7 @@ export const ProjektabgabeUebersicht = {
//~ }
//~ })
this.$refs.paabgabeTable.tabulator.setData(data);
this.$refs.paabgabeTable.tabulator.setData(this.abgaben);
},
setNoDataPlaceholder() {
this.$refs.paabgabeTable.tabulatorOptions.placeholder = this.$p.t('global/noDataAvailable');
@@ -145,45 +143,37 @@ export const ProjektabgabeUebersicht = {
loadTermine() {
this.$api.call(ApiPaabgabe.getTermine(this.selectedStudiengang, this.selectedAbgabetyp))
.then(res => {
this.selectedTermin = null;
this.termine = res?.data ?? []
})
},
loadPaAbgaben() {
this.$refs.loader.show();
//~ const func =
//~ this.personSearchString && this.personSearchString != ''
//~ ? ApiPaabgabe.searchPaAbgabenByPerson(this.personSearchString)
//~ : ApiPaabgabe.getPaAbgaben(this.selectedStudiengang, this.selectedAbgabetyp, this.selectedTermin);
this.$api.call(
ApiPaabgabe.getPaAbgaben(this.selectedStudiengang, this.selectedAbgabetyp, this.selectedTermin, this.personSearchString)
)
.then(res => {
this.$refs.loader.hide();
this.abgaben = res?.data ?? [];
this.setupData(res?.data ?? []);
});
},
handleUuidDefined(uuid) {
this.tabulatorUuid = uuid
},
searchPaAbgabenByPerson(){
this.$api.call(ApiPaabgabe.getPaAbgaben(this.selectedStudiengang, this.selectedAbgabetyp, this.selectedTermin))
.then(res => {
this.setupData(res?.data ?? []);
//this.abgaben = res?.data ?? []
});
},
//~ setRoute(val) {
//~ // TODO: router push
//~ },
async setupMounted() {
this.loadStudiengaenge();
this.loadPaabgabeTypes();
this.loadTermine();
this.tableBuiltPromise = new Promise(this.tableResolve);
await this.tableBuiltPromise;
this.setNoDataPlaceholder();
this.loadStudiengaenge();
this.loadPaabgabeTypes();
this.loadTermine();
//this.loadPaAbgaben();
@@ -202,21 +192,35 @@ export const ProjektabgabeUebersicht = {
//~ window.open(
//~ FHC_JS_DATA_STORAGE_OBJECT.app_root
//~ + FHC_JS_DATA_STORAGE_OBJECT.ci_router
//~ +'/api/frontend/v1/education/paabgabe/downloadProjektarbeit?paabgabe_id=' + encodeURIComponent(paabgabe_id),
//~ +'/api/frontend/v1/education/paabgabeuebersicht/downloadProjektarbeit?paabgabe_id=' + encodeURIComponent(paabgabe_id),
//~ '_blank'
//~ );
},
actionDownloadZip(ev) {
console.log(ev);
const url = new URL(FHC_JS_DATA_STORAGE_OBJECT.app_root
+ FHC_JS_DATA_STORAGE_OBJECT.ci_router
+'/api/frontend/v1/education/PaabgabeUebersicht/downloadZip');
if (this.selectedStudiengang) url.searchParams.append('studiengang_kz', this.selectedStudiengang);
if (this.selectedAbgabetyp) url.searchParams.append('abgabetyp_kurzbz', this.selectedAbgabetyp);
if (this.selectedTermin) url.searchParams.append('abgabedatum', this.selectedTermin);
if (this.personSearchString) url.searchParams.append('personSearchString', this.personSearchString);
console.log(url.toString());
window.open(url.toString(), '_blank');
}
},
computed: {
isDarkMode(){
isDarkMode() {
return this.$theme.theme_name.value == 'dark';
},
personSearchEnabled() {
this.loadTermine();
return this.selectedStudiengang == null && this.selectedTermin == null && this.selectedAbgabetyp == null;
},
abgabeSearchEnabled() {
return this.personSearchString == '' || this.personSearchString == null;
},
zipDownloadUrl() {
return FHC_JS_DATA_STORAGE_OBJECT.app_root + FHC_JS_DATA_STORAGE_OBJECT.ci_router + '/api/frontend/v1/education/PaabgabeUebersicht/downloadZip';
}
},
created() {
@@ -290,6 +294,10 @@ export const ProjektabgabeUebersicht = {
<div class="col-12 col-lg-2">
<button class="btn btn-primary border-0" @click="loadPaAbgaben">{{ $p.t('abgabetool/anzeigen') }}</button>
</div>
<div class="col-12 col-lg-2">
<button class="btn btn-secondary border-0" @click="actionDownloadZip">{{ $p.t('abgabetool/zipDownload') }}</button>
</div>
</div>
<core-filter-cmpt