Modul:Netzwerke

Aus MAV
Wechseln zu: Navigation, Suche

Ziel

Ziel ist es, die Netzwerke eines MAV auf seiner Personenseite abzubilden. Dazu müssen ermittelt werden:

  • während eines jeden Unibesuchs die anderen anwesenden Studenten / die anwesenden Dozenten
  • während einer Tätigkeit die Kollegen / bzw. auch Studenten, falls Dozententätigkeit
  • potentielle Zuhörer von Vorlesungen

Nötige Extensions

  • Scribunto
  • Semantic Scribunto

Zur Vorgehensweise

Das Modul verwendet drei Funktionen, die sich gegenseitig aufrufen:

  • Ganz oben steht die Funktion "Geschehnisliste". Sie looped durch alle Geschehnisse (Ausbildung, Abschlüsse, Tätigkeiten usw.), die abgefragt werden und verglichen werden sollen und ruft dann die Funktion "GeschehnisPersonenbezogen" auf, wobei sie als Parameter das aktuelle Geschehnis übergibt
  • Auf zweiter Ebene steht die Funktion "GeschehnisPersonenbezogen". Sie ermittelt für die Personenseite die personenspezifischen Daten in Bezug auf das aktuelle Ergebnis (also z.B. wo hat die Person wann studiert). Für jedes passende Ergebnis (also z.B. jeden Studienort) wird dann auf dritter Ebene die Funktion "Abgleich" aufgerufen, wobei als Parameter Geographikum, Beginn und Ende übergeben werden.
  • Auf dritter Ebene steht die Funktion "Abgleich". Sie vergleicht die personenbezogenen Parameter, die übergeben wurden, mit einer allgemeinen Abfrage. Auf diese Weise wird z.B. ermittelt, wer zur selben Zeit sonst noch studiert hat.

Es wäre sehr aufwändig und vielleicht unmöglich gewesen, die Ziele nur mit Parserfunktionen zu erreichen. Vermutlich wären sie auch wesentlich langsamer als das Luamodul. Kernproblem war, dass Text, der vom Luamodul zurückgegeben wird, nicht als Wikitext interpretiert wird, d.h. das Ergebnis kann keine funktionierende Parserfunktion und auch keine funktionierende Wikitable sein (zumindest, wenn man sie mit Wikimarkup schreibt). Das Ziel waren aber funktionierende und sortierbare Tabellen. Dieses Ziel wurde erreicht, indem die Tabellen mit HTML-Tags erstellt wurden. Sortierbar wurden sie durch Hinzufügung der Klasse "wikitable sortable" (sie ist eine standardmäßig vom Wiki vorgegebene (also nutzbare) Klasse).

Aufruf der Funktion

Bitte exakt nach folgendem Schema in der "Vorlage:MAV" aufrufen

{{#invoke:Netzwerke|Geschehnisliste|{{SUBPAGENAME}}}}

local p = {}

function p.Abgleich(FrageNach, Geographikum, Beginn, Ende)
	local queryResult = ''
	if FrageNach == 'Studenten' then
    	queryResult = mw.smw.ask( '[[Kategorie::Ausbildung]][[Geographikum::' .. Geographikum .. ']][[Beginn::<' .. Ende .. ']][[Ende::>' .. Beginn .. ']]|?Person|?Beginn|?Ende|mainlabel=-|sort=Person' )
	elseif FrageNach == 'Dozenten' then
    	queryResult = mw.smw.ask( '[[Tätigkeitsart::Dozent]][[Geographikum::' .. Geographikum .. ']][[Beginn::<' .. Ende .. ']][[Ende::>' .. Beginn .. ']]|?Person|?Beginn|?Ende|mainlabel=-|sort=Person' )
	elseif FrageNach == 'Kollegen' then
		-- NOCH OFFEN
    	return 'NochOffen. <br>'
	end

    if queryResult == nil then
        return 'Keine Personen gefunden. <br>'
    end
    
    if type( queryResult ) == "table" then
        local myResult = '<table class="wikitable sortable"><tr><th>Person</th><th>Beginn</th><th>Ende</th></tr>'
        local Geographikum = ''
        local Ende = ''
        local Beginn = ''
        for num, row in pairs( queryResult ) do
            for property, data in pairs( row ) do
                if property == 'Person' then
                    Person = data
                elseif property == 'Beginn' then
                	Beginn = data
                elseif property == 'Ende' then
                	Ende = data 
                end
            end
            myResult = myResult .. '<tr><td>' .. Person .. '</td><td>' .. Beginn .. '</td><td>' .. Ende .. '</td></tr>'        
        end
        myResult = myResult .. '</table>'
        return myResult
    end
    return myResult
end

function p.GeschehnisPersonenbezogen(value, frame)

	if true then
		return frame.args[1]
	end 
	
    local queryResult = mw.smw.ask( '[[Kategorie:' .. ']][[Person::' .. frame.args[1] .. ']]|mainlabel=-|?Geographikum#-|?Beginn|?Ende|sort=DatumSortiert|format=plainlist' )

    if queryResult == nil then
        return 'Keine Ergebnisse'
    end

    if type( queryResult ) == "table" then
        local myResult = ''
        local Geographikum = ''
        local Ende = ''
        local Beginn = ''
        for num, row in pairs( queryResult ) do
            for property, data in pairs( row ) do
                if property == 'Geographikum' then
                    Geographikum = data
                elseif property == 'Beginn' then
                	Beginn = data
                elseif property == 'Ende' then
                	Ende = data 
                end
            end
            myResult = myResult .. '<strong>Während des Studiums / der Schulzeit an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. ') anwesende Studenten / Schüler:</strong>' .. '<br>'
			myResult= myResult .. p.Abgleich('Studenten', Geographikum, Beginn, Ende)
            myResult = myResult .. '<strong>Während des Studiums / der Schulzeit an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. ') anwesende Dozenten:</strong>' .. '<br>'
			myResult= myResult .. p.Abgleich('Dozenten', Geographikum, Beginn, Ende)
        end
        return myResult
    end

    return queryResult
end

function p.Geschehnisliste(frame)
	
	local returnvalue = ''
	
	-- Testweise erstmal nur mit dem Geschehnis Ausbildung
	local looplist = {'Ausbildung'}
	-- hier die volle Liste für später
	--local looplist = {'Ausbildung', 'Abschluss', 'Gruppenzugehörigkeit', 'Tätigkeit', 'Vorlesung'}
	
	for index, value in ipairs(looplist) do
		
		returnvalue = returnvalue .. p.GeschehnisPersonenbezogen(value, frame)
		
	end
	
end

return p