Modul: Netzwerke: Unterschied zwischen den Versionen

Aus MAV
Wechseln zu: Navigation, Suche
Keine Bearbeitungszusammenfassung
Änderung 160789 von MH (Diskussion) rückgängig gemacht.
Markierung: Rückgängigmachung
 
(50 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
local p = {}
local p = {}


function p.Abgleich(FrageNach, Geographikum, Beginn, Ende)
function p.Abgleich(Geographikum, Beginn, Ende, pagename)
-- Unter "Geographikum" wird bei Gruppen der Gruppenname verstanden
  local queryResult = mw.smw.ask( '[[Geographikum::' .. Geographikum .. ']][[Beginn::<' .. Ende .. ']][[Ende::>' .. Beginn .. ']] OR [[Geographikum::' .. Geographikum .. ']][[Beginn::<' .. Beginn .. ']][[Ende::>' .. Ende .. ']]|?Beschreibungstext|?Person|?Beginn|?BeginnSicher|?Ende|?EndeSicher|mainlabel=-|sort=Beschreibungstext|order=asc' )
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
    queryResult = mw.smw.ask( '[[Kategorie:Tätigkeit]][[Geographikum::' .. Geographikum .. ']][[Beginn::<' .. Ende .. ']][[Ende::>' .. Beginn .. ']]|?Person|?Beginn|?Ende|mainlabel=-|sort=Person' )
elseif FrageNach == 'Gruppe' then
    queryResult = mw.smw.ask( '[[Kategorie:Gruppenzugehörigkeit]][[Gruppe::' .. Geographikum .. ']][[Beginn::<' .. Ende .. ']][[Ende::>' .. Beginn .. ']]|?Person|?Beginn|?Ende|mainlabel=-|sort=Person' )
end


     if queryResult == nil then
     if queryResult == nil then
Zeile 19: Zeile 9:
      
      
     if type( queryResult ) == "table" then
     if type( queryResult ) == "table" then
         local myResult = '<table class="wikitable sortable"><tr><th>Person</th><th>Beginn</th><th>Ende</th></tr>'
         local myResult = '<table class="wikitable sortable"><tr><th>Geschehnis</th><th>Person</th><th>Anfangsdatum</th><th>Anfangsdatum gesichert?</th><th>Enddatum</th><th>Enddatum gesichert?</th></tr>'
         local Personakt = ''
         local Personakt = ''
         local Endeakt = ''
         local Endeakt = ''
        local EndeaktSicher = ''
         local Beginnakt = ''
         local Beginnakt = ''
        local BeginnaktSicher = ''
        local pagenameoccurence = 0
        local rowcount = 0
        local Beschreibungstext = ''
         for num, row in pairs( queryResult ) do
         for num, row in pairs( queryResult ) do
             for property, data in pairs( row ) do
             for property, data in pairs( row ) do
Zeile 30: Zeile 25:
                 Beginnakt = data
                 Beginnakt = data
                 elseif property == 'Ende' then
                 elseif property == 'Ende' then
                 Endeakt = data  
                 Endeakt = data
                elseif property == 'BeginnSicher' then
                EndeaktSicher = data
                elseif property == 'EndeSicher' then
                BeginnaktSicher = data
                elseif property == 'Beschreibungstext' then
                Beschreibungstext = data
                 end
                 end
             end
             end
             myResult = myResult .. '<tr><td>' .. Personakt .. '</td><td>' .. Beginnakt .. '</td><td>' .. Endeakt .. '</td></tr>'      
             rowcount = rowcount + 1
            if string.find(Personakt, pagename, 1, plain) == nil then
            myResult = myResult .. '<tr><td>' .. Beschreibungstext .. '</td><td>' .. Personakt .. '</td><td>' .. Beginnakt .. '</td><td>' .. BeginnaktSicher .. '</td><td>' .. Endeakt .. '</td><td>' .. EndeaktSicher .. '</td></tr>'
            else
            pagenameoccurence = pagenameoccurence + 1
            end
        end
        if pagenameoccurence >= rowcount then
        return 'Keine Personen gefunden. <br>'
        else
        myResult = myResult .. '</table>'
         end
         end
        myResult = myResult .. '</table>'
         return myResult
         return myResult
     end
     end
Zeile 46: Zeile 56:


if geschehnis == 'Tätigkeit' then
if geschehnis == 'Tätigkeit' then
     queryResult = mw.smw.ask( '[[Kategorie:' .. geschehnis .. ']][[Person::' .. pagename .. ']]|mainlabel=-|?Tätigkeitsart|?Geographikum#-|?Beginn|?Ende|sort=DatumSortiert|format=plainlist' )
     queryResult = mw.smw.ask( '[[Kategorie:' .. geschehnis .. ']][[Person::' .. pagename .. ']]|mainlabel=-|?Tätigkeitsart#-|?Geographikum#-|?Beginn|?Ende|sort=DatumSortiert|format=plainlist' )
    elseif geschehnis == 'Gruppenzugehörigkeit' then
    queryResult = mw.smw.ask( '[[Kategorie:' .. geschehnis .. ']][[Person::' .. pagename .. ']]|mainlabel=-|?Gruppe#-|?Beginn|?Ende|sort=DatumSortiert|format=plainlist' )
elseif geschehnis == 'Ausbildung' then
elseif geschehnis == 'Ausbildung' then
     queryResult = mw.smw.ask( '[[Kategorie:' .. geschehnis .. ']][[Person::' .. pagename .. ']]|mainlabel=-|?Geographikum#-|?Beginn|?Ende|sort=DatumSortiert|format=plainlist' )
     queryResult = mw.smw.ask( '[[Kategorie:' .. geschehnis .. ']][[Person::' .. pagename .. ']]|mainlabel=-|?Geographikum#-|?Beginn|?Ende|sort=DatumSortiert|format=plainlist' )
end
end


Zeile 63: Zeile 71:
         local Beginn = ''
         local Beginn = ''
         local Taetigkeitsart = ''
         local Taetigkeitsart = ''
         local Gruppe = ''
         local Thema = ''
        local Grad = ''
        local Ereignisart = ''
         for num, row in pairs( queryResult ) do
         for num, row in pairs( queryResult ) do
             for property, data in pairs( row ) do
             for property, data in pairs( row ) do
Zeile 74: Zeile 84:
                 elseif property == 'Tätigkeitsart' then
                 elseif property == 'Tätigkeitsart' then
                 Taetigkeitsart = data
                 Taetigkeitsart = data
                 elseif property == 'Gruppe' then
                 elseif property == 'Thema' then
                 Gruppe = data
                 Thema = data
                elseif property == 'Grad' then
                Grad = data
                elseif property == 'Ereignisart' then
                Grad = data
                 end
                 end
             end
             end
  if geschehnis == 'Ausbildung' then
  if geschehnis == 'Ausbildung' then
            myResult = myResult .. '<strong>Während des Studiums / der Schulzeit an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. ') anwesende Studenten / Schüler:</strong>' .. '<br>'
            myResult = myResult .. '<strong>Studium / Schulzeit an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. '). Abgleich mit anderen Personen:</strong>' .. '<br>'
myResult= myResult .. p.Abgleich('Studenten', Geographikum, Beginn, Ende)
myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)
            myResult = myResult .. '<strong>Während des Studiums / der Schulzeit an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. ') anwesende Dozenten:</strong>' .. '<br>'
elseif geschehnis == 'Abschluss' then
myResult= myResult .. p.Abgleich('Dozenten', Geographikum, Beginn, Ende)          
            myResult = myResult .. '<strong>Promotion (' .. Grad .. ') in ' .. Geographikum .. ' (zwischen ' .. Beginn .. ' und ' .. Ende .. '). Abgleich mit anderen Personen: </strong>' .. '<br>'
myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)
             elseif geschehnis == 'Tätigkeit' then
             elseif geschehnis == 'Tätigkeit' then
if Taetigkeitsart == 'Dozent' then
myResult = myResult .. '<strong>' .. Taetigkeitsart .. ' an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. '). Abgleich mit anderen Personen:</strong>' .. '<br>'
myResult = myResult .. '<strong>Während der Tätigkeit an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. ') anwesende Studenten / Schüler:</strong>' .. '<br>'
myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)
myResult= myResult .. p.Abgleich('Studenten', Geographikum, Beginn, Ende)
elseif geschehnis == 'Vorlesung' then
myResult = myResult .. '<strong>Während der Tätigkeit an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. ') anwesende Dozenten:</strong>' .. '<br>'
            myResult = myResult .. '<strong>In ' .. Geographikum .. ' gehaltene Vorlesung zum Thema "' .. Thema .. '" (' .. Beginn .. ' bis ' .. Ende .. '). Abgleich mit anderen Personen:</strong>' .. '<br>'
myResult= myResult .. p.Abgleich('Dozenten', Geographikum, Beginn, Ende)
myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)
else
elseif geschehnis == 'Ereignis' then
myResult = myResult .. '<strong>Während der Tätigkeit an der Körperschaft ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. ') anwesende Kollegen:</strong>' .. '<br>'
            myResult = myResult .. '<strong>' .. Ereignisart .. 'in ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. '). Abgleich mit anderen Personen:</strong>' .. '<br>'
myResult= myResult .. p.Abgleich('Kollegen', Geographikum, Beginn, Ende)
  myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)
end
elseif geschehnis == 'Gruppenzugehörigkeit' then
            myResult = myResult .. '<strong>Angehörige der Gruppe "' .. Gruppe .. '" (während der Zeit von ' .. Beginn .. ' bis ' .. Ende .. '):</strong>' .. '<br>'
  myResult= myResult .. p.Abgleich('Gruppe', Gruppe, Beginn, Ende)
-- Der übergebene Parameter wird bei der Funktion "Abgleich" der Einfachheit halber unter "Geographikum" subsumiert
end
end
         end
         end
Zeile 110: Zeile 120:
local returnvalue = ''
local returnvalue = ''
-- Testweise erstmal nur mit dem Geschehnis Tätigkeit
local looplist = {'Ausbildung', 'Tätigkeit'}
local looplist = {'Ausbildung', 'Tätigkeit', 'Gruppenzugehörigkeit'}
 
-- hier die volle Liste für später
--local looplist = { 'Abschluss', 'Vorlesung'}
for index, geschehnis in ipairs(looplist) do
for index, geschehnis in ipairs(looplist) do

Aktuelle Version vom 17. November 2025, 22:46 Uhr

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(Geographikum, Beginn, Ende, pagename)
  	local queryResult = mw.smw.ask( '[[Geographikum::' .. Geographikum .. ']][[Beginn::<' .. Ende .. ']][[Ende::>' .. Beginn .. ']] OR [[Geographikum::' .. Geographikum .. ']][[Beginn::<' .. Beginn .. ']][[Ende::>' .. Ende .. ']]|?Beschreibungstext|?Person|?Beginn|?BeginnSicher|?Ende|?EndeSicher|mainlabel=-|sort=Beschreibungstext|order=asc' )

    if queryResult == nil then
        return 'Keine Personen gefunden. <br>'
    end
    
    if type( queryResult ) == "table" then
        local myResult = '<table class="wikitable sortable"><tr><th>Geschehnis</th><th>Person</th><th>Anfangsdatum</th><th>Anfangsdatum gesichert?</th><th>Enddatum</th><th>Enddatum gesichert?</th></tr>'
        local Personakt = ''
        local Endeakt = ''
        local EndeaktSicher = ''
        local Beginnakt = ''
        local BeginnaktSicher = ''
        local pagenameoccurence = 0
        local rowcount = 0
        local Beschreibungstext = ''
        for num, row in pairs( queryResult ) do
            for property, data in pairs( row ) do
                if property == 'Person' then
                    Personakt = data
                elseif property == 'Beginn' then
                	Beginnakt = data
                elseif property == 'Ende' then
                	Endeakt = data
                elseif property == 'BeginnSicher' then
                	EndeaktSicher = data
                elseif property == 'EndeSicher' then
                	BeginnaktSicher = data
                elseif property == 'Beschreibungstext' then
                	Beschreibungstext = data
                end
            end
            rowcount = rowcount + 1
            if string.find(Personakt, pagename, 1, plain) == nil then
            	myResult = myResult .. '<tr><td>' .. Beschreibungstext .. '</td><td>' .. Personakt .. '</td><td>' .. Beginnakt .. '</td><td>' .. BeginnaktSicher .. '</td><td>' .. Endeakt .. '</td><td>' .. EndeaktSicher .. '</td></tr>'
            else
            	pagenameoccurence = pagenameoccurence + 1
            end
        end
        if pagenameoccurence >= rowcount then
        	return 'Keine Personen gefunden. <br>'
        else
        	myResult = myResult .. '</table>'
        end
        return myResult
    end
    return myResult
end

function p.GeschehnisPersonenbezogen(geschehnis, pagename)

	local queryResult = ''

	if geschehnis == 'Tätigkeit' then
    	queryResult = mw.smw.ask( '[[Kategorie:' .. geschehnis .. ']][[Person::' .. pagename .. ']]|mainlabel=-|?Tätigkeitsart#-|?Geographikum#-|?Beginn|?Ende|sort=DatumSortiert|format=plainlist' )
	elseif geschehnis == 'Ausbildung' then
    	queryResult = mw.smw.ask( '[[Kategorie:' .. geschehnis .. ']][[Person::' .. pagename .. ']]|mainlabel=-|?Geographikum#-|?Beginn|?Ende|sort=DatumSortiert|format=plainlist' )
	end

    if queryResult == nil then
        return ''
    end

    if type( queryResult ) == "table" then
        local myResult = ''
        local Geographikum = ''
        local Ende = ''
        local Beginn = ''
        local Taetigkeitsart = ''
        local Thema = ''
        local Grad = ''
        local Ereignisart = ''
        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 
                elseif property == 'Tätigkeitsart' then
                	Taetigkeitsart = data
                elseif property == 'Thema' then
                	Thema = data
                elseif property == 'Grad' then
                	Grad = data
                elseif property == 'Ereignisart' then
                	Grad = data
                end
            end
 			if geschehnis == 'Ausbildung' then
	            myResult = myResult .. '<strong>Studium / Schulzeit an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. '). Abgleich mit anderen Personen:</strong>' .. '<br>'
				myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)
 			elseif geschehnis == 'Abschluss' then
	            myResult = myResult .. '<strong>Promotion (' .. Grad .. ') in ' .. Geographikum .. ' (zwischen ' .. Beginn .. ' und ' .. Ende .. '). Abgleich mit anderen Personen: </strong>' .. '<br>'
				myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)
            elseif geschehnis == 'Tätigkeit' then
				myResult = myResult .. '<strong>' .. Taetigkeitsart .. ' an der ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. '). Abgleich mit anderen Personen:</strong>' .. '<br>'
				myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)
			elseif geschehnis == 'Vorlesung' then 
            	myResult = myResult .. '<strong>In ' .. Geographikum .. ' gehaltene Vorlesung zum Thema "' .. Thema .. '" (' .. Beginn .. ' bis ' .. Ende .. '). Abgleich mit anderen Personen:</strong>' .. '<br>'
 				myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)	
			elseif geschehnis == 'Ereignis' then
             	myResult = myResult .. '<strong>' .. Ereignisart .. 'in ' .. Geographikum .. ' (' .. Beginn .. ' bis ' .. Ende .. '). Abgleich mit anderen Personen:</strong>' .. '<br>'
 				myResult= myResult .. p.Abgleich(Geographikum, Beginn, Ende, pagename)				
			end
        end
        return myResult
    end

    return queryResult
end

function p.Geschehnisliste(frame)
	

	local returnvalue = ''
	
	local looplist = {'Ausbildung', 'Tätigkeit'}

	for index, geschehnis in ipairs(looplist) do
		
		returnvalue = returnvalue .. p.GeschehnisPersonenbezogen(geschehnis, frame.args[1])
		
	end
	
	return returnvalue
	
end

return p