diff --git a/MANIFEST.in b/MANIFEST.in index 10ee06a10..ac19dea33 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,5 @@ include README.md include knora/dsplib/utils/knora-schema.json include knora/dsplib/utils/knora-schema-lists.json -include knora/knora-data-schema.xsd +include knora/dsplib/utils/knora-data-schema.xsd include knora/icons/knora-py-logo.png diff --git a/Makefile b/Makefile index 027357acc..6fe3bb16b 100644 --- a/Makefile +++ b/Makefile @@ -71,4 +71,11 @@ clean: ## cleans the project directory help: ## this help @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | sort +.PHONY: run +run: ## create dist, inatall and run + $(MAKE) clean + $(MAKE) dist + $(MAKE) install + dsp-tools + .DEFAULT_GOAL := help diff --git a/README.md b/README.md index 41b65fab3..52b9a2626 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,9 @@ $ make test ## Publishing to PyPi -Generate distribution package. Make sure you have the latest versions of `setuptools` and `wheel` installed: +Generate distribution package. Make sure you have the latest versions of `setuptools` and `wheel` installed. +Remove the `dist`and `buil`-directories: `rm -rf bild dist` + ```bash $ make upgrade-dist-tools diff --git a/docs/dsp-tools-create.md b/docs/dsp-tools-create.md index aea7e8eca..857d04a1d 100644 --- a/docs/dsp-tools-create.md +++ b/docs/dsp-tools-create.md @@ -325,7 +325,11 @@ This object contains _user_-definitions. You can set user traits here. A user ha - _familyName_: Surname of the user. - _password_: Password of the user. - _lang_: The preferred language of the user: "en", "de", "fr", "it" [optional, default: "en"]. -- _projects_: List of projects the user belongs to. +- _projects_: List of projects the user belongs to. The project name has to be followed by a ":" and + either "member" or "admin". This indicates if the new user has admin rights in the given project or + is a oridnary user. This `myproject:admin` would add the user as admin to the project "myproject". + The given project defined in the same ontology file has no name, so only ":admin" or ":member" is + required. A user must be member of at least one project. Example: ```json diff --git a/docs/dsp-tools-xmlupload.md b/docs/dsp-tools-xmlupload.md index eced2ad91..050c17b13 100644 --- a/docs/dsp-tools-xmlupload.md +++ b/docs/dsp-tools-xmlupload.md @@ -27,7 +27,7 @@ Thus, the ``-eelment may b used as follows: xsi:schemaLocation="../knora-data-schema.xsd" shortcode="0806" ontology="webern"> -… + ... ``` The ``-element can only contain @@ -112,7 +112,33 @@ _Options_: - "SystemAdmin" _Subelements allowed_: None - + +Thus a complete _permission_ section may be as follows: +```xml + + RV + V + CR + CR + + + V + CR + CR + + + V + V + CR + CR + + + V + CR + CR + +``` + ### `` A `resource`-element contains all necessary information to create a resource. It has the following options: @@ -127,14 +153,14 @@ _Options_: - _permissions_: a reference to a permission set. These permissions will be applied to the newly created resoource. [optional] -```` +```xml -… + ... -```` +``` The ``-element contains for each property class a `property`-element which itself contains one or several `value`-elements. It _must_ also contain an ``-element if the @@ -148,6 +174,8 @@ _name_-option: Example: ```xml + Dies ist eine Übersetzung + ``` The ``-element may contain the following tags describing properties (data fields): @@ -171,18 +199,60 @@ The ``-element may contain the following tags describing properties (d #### ``-element The ``-element contains the path to an image file. It must only be used if the -resource is a `StillImageResource`! +resource is a `StillImageRepresentation` and must be the first element! _Options_: - none -_Note_: There is only _one_ ``-element allowed per StillImageResource! +_Note_: There is only _one_ ``-element allowed per StillImageRepresentation! Example: ```xml postcards.dir/images/EURUS015a.jpg ``` +#### ``-element +The ``-element contains the path to an sound file. It must only be used if the +resource is a `AudioRepresentation` and must be the first element! + +_Options_: +- none + +_Note_: There is only _one_ ``-element allowed per AudioRepresentation! + +Example: +```xml +concerts.dir/files/SOTW.wav +``` + +#### ``-element +The ``-element contains the path to an movie file. It must only be used if the +resource is a `MovingImageRepresentation` and must be the first element! + +_Options_: +- none + +_Note_: There is only _one_ ``-element allowed per MovingImageRepresentation! + +Example: +```xml +movies.dir/files/the_general.mp4 +``` + +#### ``-element +The ``-element contains the path to an document file. It must only be used if the +resource is a `DocumentRepresentation` and must be the first element! + +_Options_: +- none + +_Note_: There is only _one_ ``-element allowed per DocumentRepresentation! + +Example: +```xml +facsimiles/files/we_the_people.pdf +``` + #### ``-element The text property element is used to list text values. @@ -196,42 +266,33 @@ _Options_: The ``-element has the following options: - _encoding_: either "utf8" or "hex64" [required] - _utf8_: The element describes a simple text without markup. The text is a simple utf-8 string - - _hex64_: The elemen describes a complex text containing markup. It must be a hex64 encoded string in the - XML-format as defined by Knora. -- _resrefs_: A list of resource ID's that are referenced in the markup, separated by the "|"-character such as `"2569981|6618"` [optional] + - _xml_: The element describes a complex text containing markup. It must be follow the XML-format as defined by the + [DSP standard mapping](https://docs.knora.org/03-apis/api-v1/xml-to-standoff-mapping/) . - _permissions_: ID or a permission set. Optional, but if omitted very restricted default permissions apply! - _comment_: A comment to this specific value. +###### Simple Text +A complete example for a simple text: +```xml + + Probe bei "Wimberger". Lokal in Wien? + +``` + +###### Text with Markup Knora-xml-import assumes that for markup-text (standoff-markup) standard mapping for Knora is being used (Custom mapping to customized standoff tags is not yet implemented!) -E.g. a text containing a link to another resource must have the following form before being -encoded as hex64-string: +E.g. a text containing a link to another resource must have the following form: ```xml -'Brief:

Webern an Willheim, 10.10.1928

' +The third object and a link to. ``` -Please note that the href-option withiin the anchor tag points to an internal resource of knora +Please note that the href-option within the anchor tag points to an internal resource of knora and this has to have the special format "`IRI:`res-id`:IRI`" where res-id is the resource id defined within the XML import file. A resource already existing in knora can be referenced by indicating its IRI directly has _href_-option. -In case the string references one or more internal resources, the option `resrefs`_must_ be using to -indicate there ID's! The ID's are separated by a "|"-character - -A complete example for a simple text: -```xml - - Probe bei "Wimberger". Lokal in Wien? - -``` -A complete example of a complex text which encodes the text `

Webern an Willheim, 10.10.1928

` containing -a link to the internal resource with the ID="6618": -```xml - - PGEgY2xhc3M9InNhbHNhaC1saW5rIiBocmVmPSJJUkk6NjYxODpJUkkiPjxwPldlYmVybiBhbiBXaWxsaGVpbSwgMTAuMTAuMTkyODwvcD48L2E+PHA+PC9wPg== - -``` -Within one text property, simple and complex text values may be mixed. +Within one text property, multiple simple and complex text values may be mixed. #### ``-element The color-prop eelement is used to define a color property. @@ -273,7 +334,7 @@ calendar:epoch:yyyy-mm-dd:epoch:yyyy-mm-dd - _dd_: day eith two digits If two dates are given, the date is in between the two given limits. If the day is omitted, -then the precision it _month_, if also the month is omited, the procision is _year_. +then the precision it _month_, if also the month is omited, the precision is _year_. _Options_: - _permissions_: ID or a permission set. Optional, but if omitted very restricted default permissions apply! @@ -284,6 +345,7 @@ Examples: GREGORIAN:CE:2014-01-31 GREGORIAN:CE:1930-09-02:CE:1930-09-03 ``` + #### ``-element Properties with decimal values. Contains one or more ``-tags. @@ -543,4 +605,231 @@ Example: 0 ``` +## Complete example + +```xml + + + + + RV + V + CR + CR + D + + + V + CR> + CR> + M> + + + V + V + CR + CR> + D> + + + V + CR + CR + M + + + + + Tree list node 02 + + + Tree list node 03 + + + The third object and a link to. + + + + The third object and a link to. + + + + Dies ist ein einfacher Text ohne Markup + Nochmals ein einfacher Text + + + JULIAN:CE:1401-05-17:CE:1402-01 + + + 4711 + + + 2.718281828459 + + + true + + + http://dasch.swiss/gaga + + + 12.5:14.2 + + + #00ff00 + + + + { + "status":"active", + "lineColor":"#ff3333", + "lineWidth":2, + "points":[ + {"x":0.08098591549295775,"y":0.16741071428571427}, + {"x":0.7394366197183099,"y":0.7299107142857143}], + "type":"rectangle", + "original_index":0 + } + + + + 5416656 + + + obj_0002 + + + + + + + Tree list node 10 + + + Tree list node 11 + + + What is this bold thing? + + + aa bbb cccc ddddd + + + 1888 + + + 42 + + + 3.14159 + + + false + + + http://unibas.ch/gugus + + + 24:100.075 + + + #33ff77 + + + + { + "status":"active", + "lineColor":"#ff3333", + "lineWidth":2, + "points":[ + {"x":0.08098591549295775,"y":0.16741071428571427}, + {"x":0.7394366197183099,"y":0.7299107142857143}], + "type":"rectangle", + "original_index":0 + } + + + + 5416656 + + + obj_0003 + + + + + + Tree list node 01 + + + Tree list node 02 + + + This is bold and string text! + + + aa bbb cccc ddddd + + + 1888 + + + 42 + + + 3.14159 + + + false + + + http://unibas.ch/gugus + + + 24:100.075 + + + #33ff77 + + + + { + "status":"active", + "lineColor":"#ff3333", + "lineWidth":2, + "points":[ + {"x":0.08098591549295775,"y":0.16741071428571427}, + {"x":0.7394366197183099,"y":0.7299107142857143}], + "type":"rectangle", + "original_index":0 + } + + + + 5416656 + + + + + gaga.tif + + This is the famous Lena + + + + +``` diff --git a/knora/anything-test-data.xml b/knora/anything-test-data.xml index bad2d10f0..ce0b7d906 100644 --- a/knora/anything-test-data.xml +++ b/knora/anything-test-data.xml @@ -214,7 +214,8 @@ restype=":ThingPicture" id="obj_0004" permissions="res-default"> - gaga.tif + gaga.tif + This is the famous Lena diff --git a/knora/bitstreams/TEMP11.TIF b/knora/bitstreams/TEMP11.TIF new file mode 100755 index 000000000..ea27affc8 Binary files /dev/null and b/knora/bitstreams/TEMP11.TIF differ diff --git a/knora/bitstreams/TEMP12.TIF b/knora/bitstreams/TEMP12.TIF new file mode 100755 index 000000000..8664433c5 Binary files /dev/null and b/knora/bitstreams/TEMP12.TIF differ diff --git a/knora/bitstreams/TEMP13.TIF b/knora/bitstreams/TEMP13.TIF new file mode 100755 index 000000000..85570d645 Binary files /dev/null and b/knora/bitstreams/TEMP13.TIF differ diff --git a/knora/bitstreams/TEMP14.TIF b/knora/bitstreams/TEMP14.TIF new file mode 100755 index 000000000..ca08fc801 Binary files /dev/null and b/knora/bitstreams/TEMP14.TIF differ diff --git a/knora/bitstreams/TEMP15.TIF b/knora/bitstreams/TEMP15.TIF new file mode 100755 index 000000000..459d2c03e Binary files /dev/null and b/knora/bitstreams/TEMP15.TIF differ diff --git a/knora/bitstreams/clara.wav b/knora/bitstreams/clara.wav new file mode 100755 index 000000000..c93dc5a69 Binary files /dev/null and b/knora/bitstreams/clara.wav differ diff --git a/knora/bitstreams/test.csv b/knora/bitstreams/test.csv new file mode 100644 index 000000000..6a9743088 --- /dev/null +++ b/knora/bitstreams/test.csv @@ -0,0 +1,385 @@ +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,DHLab Stellen Ist 2019,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,, <,,,,,,,,,,,,,,,Personen,,,,,,,,,,,,,>, <,,,,,,,,Räume IST,,,,,,,>, <,,,,,Räume SOLL,,>, +,Index,Planstelle,Person-Vertrag,Kostenstelle CO-Objekt,,"Personenname +(Name, Vorname)",Personalkategorie ,Personalkategorie SAP,DHLab intern,"Finanzierung +Uni","Finanzierung +SNF","Finanzierung +Drittmittel",Beschäftigungsgrad % ,persönlicher Arbeitsplatz,Arbeitsplatzanspruch,Funktionskategorie (FIM),Bürofläche m2,Raumtyp,"Übergeordnete +Organisationseinheit ","Untergeordnete +Organisationseinheit",Forschungsgruppe (deutsch),Abkürzungt (deu.),Forschungsgruppe (englisch),Abkürzungt (engl.),OE Ergänzung 2,Vorgänger,Austritt,Ausschreibung,Nachfolger,Antritt,"Arbeitsplatz 1 + Gebäude",Arbeitsplatz 1 Raumnummer,"Arbeitsplatz 1 + Fläche IST","Arbeitsplatz 1 + Fläche KORRIGIERT","Arbeitsplatz 1 +AP-Nr. WSW",Maximal-Belegung,Belegungsgrad,"Arbeitsplatz 2 + Gebäude",Arbeitsplatz 2 Raumnummer,"Arbeitsplatz 2 +Fläche","Arbeitsplatz 2 +AP-Nr. WSW","Labor +Gebäude","Labor +Raumnummer","Labor +Fläche","Gewächshaus +Ort","Infrastruktur +Art (soweit erf.)","Arbeitsplatz 1 SOLL + Gebäude",Arbeitsplatz 1 SOLL Raumnummer,"Arbeitsplatz 1 SOLL +Fläche ","Labor SOLL +Gebäude","Labor SOLL +Raumnummer","Labor SOLL +Fläche","Infrastruktur SOLL +Art (soweit erf.)","Infrastruktur SOLL +Ort",Bemerkungen +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,11,21027,27328,DGK2477,Digital Humanities Sammeltopf,Hillenbrand Gabriel,,Administrativperson,,22%,0%,0%,22%,NEIN,0.4,4,5.9,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,14,?,?,?,?,Kälin Irene ,,Administrativperson,"PHD-Administration, Per 1.9.2019: 20%",20%,0%,0%,20%,NEIN,0.3,4,5.3,Mehrplatzbüro,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,16,12455,45899,GK4805,Digital Humanities Lab,Kuster Vettiger Gabriela,,Administrativperson,,50%,0%,0%,50%,JA,1,4,13.3,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,26,20375,2525,GK4805,Digital Humanities Lab,Rosenthaler Lukas,,Associate Professor,,50%,0%,0%,50%,JA,1,2,18,Einzelbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,1,21988,25655,GK4805,Digital Humanities Lab,Aeschlimann Andreas,,Doktorierende/r,60% (in Abklärung),60%,0%,0%,60%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,2,18105,41153,NGK2163,Bernoulli-Euler Online (BEOL),Alassi Sepideh,,Doktorierende/r,,0%,100%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,3,22317,50652,DGK2790,DP Digital Humanities,Bucher Magdalena,,Hilfsassistent/in,Stundenlohn,0%,0%,0%,0%,NEIN,0.0,0,0.0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,4,15554,40612,DGK2477,Digital Humanities Sammeltopf,Buder Stefanie,,Hilfsassistent/in,,20%,0%,0%,20%,NEIN,0.0,0,0.0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,9,22703,49788,NGK2278,WordWeb / Intertextuality in Drama,Heeg Stefanie,,Hilfsassistent/in,,20%,0%,0%,20%,NEIN,0.0,0,0.0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,21,15553,47533,GX1102,Fakultärer Mittelpool Phil.-Hist.,Meier Daniela,,Hilfsassistent/in,(Masterstudiumsadmin),28%,0%,0%,28%,NEIN,0.0,0,0.0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,27,22898,50247,NGK2280,Mining Goodreads: a text similarity-base,Ruh Lina,,Hilfsassistent/in,,20%,0%,0%,20%,NEIN,0.0,0,0.0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,8,20205,44925,GK4805,Digital Humanities Lab,Häner Céline,,Lehrling Technik/Labor,,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,7,?,?,?,?,Gasser Brigitte ,,PostDoc,Aufbau Research Adviser,0%,40%,0%,40%,NEIN,0.7,6,8,Mehrplatzbüro,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,10,20070,44583,GK4805,Digital Humanities Lab,Herrmann Berenike,,PostDoc,,60%,0%,0%,60%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,18,22741,49285,NGK2280,Mining Goodreads: a text similarity-base,Lendvai Piroska Kornelia,,PostDoc,,0%,20%,0%,20%,NEIN,0.3,6,2.7,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,20,22583,49277,NGK2276,Geteiltes Lesen. Literatur digital lesen,Maria Kraxenberger,,PostDoc,65% (ersetzt Brigitte Gasser),65%,0%,0%,65%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,22,22375,41183,NGK2281,Forschungslogiken i. d. textbasierten Di,Messerli Thomas,,PostDoc,per 1.2. 5%,0%,60%,0%,60%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,23,21358,46865,NGK2253,Wirkungsgeschichte von Goethes Werk,Nickol Thomas,,PostDoc,extern: Uni Göttingen,0%,100%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,24,22529,49192,NGK2280,Mining Goodreads: a text similarity-base,Rebora Simone,,PostDoc,,0%,20%,0%,20%,NEIN,0.3,6,2.7,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,17,17015,44571,GK4805,Digital Humanities Lab,Lauer Gerhard,,Professor,,100%,0%,0%,100%,JA,1,2,18,Einzelbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,31,17926,49151,DGK2477,Digital Humanities Sammeltopf,Vögelin Samuel ,,Übriges Personal (nicht SIUS),Praktikant,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,5,19824,44173,DGK2790,DP Digital Humanities,Chiquet Vera,,Wissensch. Mitarb.,35% (rutscht dann ganz ins DaSCH),35%,0%,0%,35%,NEIN,0.6,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,6,2044,1438,GK4805,Digital Humanities Lab,Fornaro Peter,,Wissensch. Mitarb.,,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,13,22289,6286,NGK2278,WordWeb / Intertextuality in Drama,Hohl Trillini Regula,,Wissensch. Mitarb.,,60%,0%,0%,60%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,15,20756,45737,BGK1074,Berufungszusage Lauer - GK4805,Kuijpers Moniek,,Wissensch. Mitarb.,,70%,0%,0%,70%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,19,22986,50345,NGK2280,Mining Goodreads: a text similarity-base,Lusetti Massimo,,Wissensch. Mitarb.,,0%,20%,0%,20%,NEIN,0.3,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,25,22987,50344,NGK2280,Mining Goodreads: a text similarity-base,Renner Lukas,,Wissensch. Mitarb.,,0%,20%,0%,20%,NEIN,0.3,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,28,22897,41048,NGK2280,Mining Goodreads: a text similarity-base,Tadres Jonathan,,Wissensch. Mitarb.,,0%,20%,0%,20%,NEIN,0.3,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,29,22588,49432,NGK2278,WordWeb / Intertextuality in Drama,Tissaveerasingham Vijeinath,,Wissensch. Mitarb.,,0%,80%,0%,80%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,30,2078,1840,DGK2477,Digital Humanities Sammeltopf,Tschakert Alexandra,,Wissensch. Mitarb.,,20%,0%,0%,20%,NEIN,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,32,22988,50342,NGK2280,Mining Goodreads: a text similarity-base,Vogelsanger Johanna Letizia,,Wissensch. Mitarb.,,0%,20%,0%,20%,NEIN,0.3,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,33,20728,41647,BGK1075,Berufungszusage Rosenthaler - GK4805,Zbinden Erwin,,Wissensch. Mitarb.,,50%,0%,0%,50%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,21071,22046,GX1102,Fakultärer Mittelpool Phil.-Hist.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,1550%,,21,,226,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,Projekte laufen Mitte 2020 aus,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,Bitte prüfen,,,Projekte laufen Ende 2020 aus,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,DHLab Stellen Soll 2020,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,, <,,,,,,,,,,,,,,,Personen,,,,,,,,,,,,,>, <,,,,,,,,Räume IST,,,,,,,>, <,,,,,Räume SOLL,,>, +,Index,Planstelle,Person-Vertrag,Kostenstelle CO-Objekt,,"Personenname +(Name, Vorname)",Personalkategorie ,Personalkategorie SAP,DHLab intern,"Finanzierung +Uni","Finanzierung +SNF","Finanzierung +Drittmittel",Beschäftigungsgrad % ,persönlicher Arbeitsplatz,Arbeitsplatzanspruch,Funktionskategorie (FIM),Bürofläche m2,Raumtyp,"Übergeordnete +Organisationseinheit ","Untergeordnete +Organisationseinheit",Forschungsgruppe (deutsch),Abkürzungt (deu.),Forschungsgruppe (englisch),Abkürzungt (engl.),OE Ergänzung 2,Vorgänger,Austritt,Ausschreibung,Nachfolger,Antritt,"Arbeitsplatz 1 + Gebäude",Arbeitsplatz 1 Raumnummer,"Arbeitsplatz 1 + Fläche IST","Arbeitsplatz 1 + Fläche KORRIGIERT","Arbeitsplatz 1 +AP-Nr. WSW",Maximal-Belegung,Belegungsgrad,"Arbeitsplatz 2 + Gebäude",Arbeitsplatz 2 Raumnummer,"Arbeitsplatz 2 +Fläche","Arbeitsplatz 2 +AP-Nr. WSW","Labor +Gebäude","Labor +Raumnummer","Labor +Fläche","Gewächshaus +Ort","Infrastruktur +Art (soweit erf.)","Arbeitsplatz 1 SOLL + Gebäude",Arbeitsplatz 1 SOLL Raumnummer,"Arbeitsplatz 1 SOLL +Fläche ","Labor SOLL +Gebäude","Labor SOLL +Raumnummer","Labor SOLL +Fläche","Infrastruktur SOLL +Art (soweit erf.)","Infrastruktur SOLL +Ort",Bemerkungen +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,7,21027,27328,DGK2477,Digital Humanities Sammeltopf,Hillenbrand Gabriel,,Administrativperson,10%,22%,0%,0%,22%,NEIN,0.4,4,5.9,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,9,12455,45899,GK4805,Digital Humanities Lab,Kuster Vettiger Gabriela,,Administrativperson,,50%,0%,0%,50%,JA,1,4,13.3,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,13,20375,2525,GK4805,Digital Humanities Lab,Rosenthaler Lukas,,Associate Professor,,50%,0%,0%,50%,JA,1,2,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,1,21988,25655,GK4805,Digital Humanities Lab,Aeschlimann Andreas,,Doktorierende/r,,60%,0%,0%,60%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,17,?,?,?,?,NN 3,,Doktorierende/r,"Europäisches Projekt, asap",0%,0%,100%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,2,15554,40612,DGK2477,Digital Humanities Sammeltopf,Buder Stefanie,,Hilfsassistent/in,,20%,0%,0%,20%,NEIN,0.3,0,0.0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,11,15553,47533,GX1102,Fakultärer Mittelpool Phil.-Hist.,Meier Daniela,,Hilfsassistent/in,,28%,0%,0%,28%,NEIN,0.5,0,0.0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,15,?,?,?,?,NN 1,,Hilfsassistent/in,"neues Projekt Lauer, ab ?",0%,0%,30%,30%,NEIN,0.5,0,0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,16,?,?,?,?,NN 2,,Hilfsassistent/in,"neues Projekt Lauer, ab ?",0%,0%,30%,30%,NEIN,0.5,0,0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,5,20205,44925,GK4805,Digital Humanities Lab,Häner Céline,,Lehrling Technik/Labor,,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,4,?,?,?,?,Gasser Brigitte ,,PostDoc,,0%,40%,0%,40%,NEIN,0.7,6,8,Mehrplatzbüro,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,6,20070,44583,GK4805,Digital Humanities Lab,Herrmann Berenike,,PostDoc,,60%,0%,0%,60%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,12,21358,46865,NGK2253,Wirkungsgeschichte von Goethes Werk,Nickol Thomas,,PostDoc,extern: Uni Göttingen,0%,100%,0%,100%,JA,0,6,0,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,10,17015,44571,GK4805,Digital Humanities Lab,Lauer Gerhard,,Professor,,100%,0%,0%,100%,JA,1,2,18,Einzelbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,3,2044,1438,GK4805,Digital Humanities Lab,Fornaro Peter,,Wissensch. Mitarb.,,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,8,20756,45737,BGK1074,Berufungszusage Lauer - GK4805,Kuijpers Moniek,,Wissensch. Mitarb.,,70%,0%,0%,70%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,14,2078,1840,DGK2477,Digital Humanities Sammeltopf,Tschakert Alexandra,,Wissensch. Mitarb.,,20%,0%,0%,20%,NEIN,0.3,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,21071,22046,GX1102,Fakultärer Mittelpool Phil.-Hist.,Anna Diack,,Hilfsassistent/in,12%,12%,0%,0%,12%,NEIN,,6,,,,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,992%,,12,,109,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,DHLab Stellen Soll 2021-2024,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,, <,,,,,,,,,,,,,,,Personen,,,,,,,,,,,,,>, <,,,,,,,,Räume IST,,,,,,,>, <,,,,,Räume SOLL,,>, +,Index,Planstelle,Person-Vertrag,Kostenstelle CO-Objekt,,"Personenname +(Name, Vorname)",Personalkategorie ,Personalkategorie SAP,DHLab intern,"Finanzierung +Uni","Finanzierung +SNF","Finanzierung +Drittmittel",Beschäftigungsgrad % ,persönlicher Arbeitsplatz,Arbeitsplatzanspruch,Funktionskategorie (FIM),Bürofläche m2,Raumtyp,"Übergeordnete +Organisationseinheit ","Untergeordnete +Organisationseinheit",Forschungsgruppe (deutsch),Abkürzungt (deu.),Forschungsgruppe (englisch),Abkürzungt (engl.),OE Ergänzung 2,Vorgänger,Austritt,Ausschreibung,Nachfolger,Antritt,"Arbeitsplatz 1 + Gebäude",Arbeitsplatz 1 Raumnummer,"Arbeitsplatz 1 + Fläche IST","Arbeitsplatz 1 + Fläche KORRIGIERT","Arbeitsplatz 1 +AP-Nr. WSW",Maximal-Belegung,Belegungsgrad,"Arbeitsplatz 2 + Gebäude",Arbeitsplatz 2 Raumnummer,"Arbeitsplatz 2 +Fläche","Arbeitsplatz 2 +AP-Nr. WSW","Labor +Gebäude","Labor +Raumnummer","Labor +Fläche","Gewächshaus +Ort","Infrastruktur +Art (soweit erf.)","Arbeitsplatz 1 SOLL + Gebäude",Arbeitsplatz 1 SOLL Raumnummer,"Arbeitsplatz 1 SOLL +Fläche ","Labor SOLL +Gebäude","Labor SOLL +Raumnummer","Labor SOLL +Fläche","Infrastruktur SOLL +Art (soweit erf.)","Infrastruktur SOLL +Ort",Bemerkungen +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,1,21988,25655,GK4805,Digital Humanities Lab,N.N,,Doktorierende/r,,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,2,15554,40612,DGK2477,Digital Humanities Sammeltopf,Buder Stefanie,,Hilfsassistent/in,,0%,0%,20%,20%,NEIN,0.0,0,0.0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,3,2044,1438,GK4805,Digital Humanities Lab,Fornaro Peter*,,Wissensch. Mitarb.,,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,4,?,?,?,?,Gasser Brigitte ,,PostDoc,,0%,40%,0%,40%,NEIN,0.7,6,8,Mehrplatzbüro,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,5,20205,44925,GK4805,Digital Humanities Lab,Häner Céline,,Lehrling Technik/Labor,,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,6,20070,44583,GK4805,Digital Humanities Lab,Herrmann Berenike,,PostDoc,,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,7,21027,27328,DGK2477,Digital Humanities Sammeltopf,Hillenbrand Gabriel,,Administrativperson,10%,0%,0%,22%,22%,NEIN,0.4,0,5.9,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,8,21071,22046,GX1102,Fakultärer Mittelpool Phil.-Hist.,Hillenbrand Gabriel,,hilfsassistent/in,12%,12%,0%,0%,12%,ja,0.2,0,3.2,,,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,9,20756,45737,BGK1074,Berufungszusage Lauer - GK4805,Kuijpers Moniek,,Wissensch. Mitarb.,,70%,0%,0%,70%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,10,12455,45899,GK4805,Digital Humanities Lab,Kuster Vettiger Gabriela,,Administrativperson,,50%,0%,0%,50%,JA,1,4,13.3,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,11,17015,44571,GK4805,Digital Humanities Lab,Lauer Gerhard,,Professor,,100%,0%,0%,100%,JA,1,2,18,Einzelbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,12,15553,47533,GX1102,Fakultärer Mittelpool Phil.-Hist.,Meier Daniela,,Hilfsassistent/in,,28%,0%,0%,28%,NEIN,0.0,0,0.0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,13,21358,46865,NGK2253,Wirkungsgeschichte von Goethes Werk,Nickol Thomas,,PostDoc,extern: Uni Göttingen,0%,100%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,14,20375,2525,GK4805,Digital Humanities Lab,Rosenthaler Lukas*,,Associate Professor,,100%,0%,0%,100%,JA,1,2,18,Einzelbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,15,2078,1840,DGK2477,Digital Humanities Sammeltopf,Tschakert Alexandra,,Wissensch. Mitarb.,,,0%,20%,20%,NEIN,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,16,?,?,NGK2332,SNF Projekt,NN 1,,Doktorierende/r,"neues Projekt Herrmann, ab 2020",0%,0%,100%,100%,JA,1.0,0,0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,16,?,?,NGK2332,SNF Projekt,Priska Hadayani Rüegg,,Hilfsassistent/in,"neues Projekt Herrmann, ab 2020",0%,0%,25%,25%,NEIN,0.4,0,0,-,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,17,,,NGK2332,SNF Projekt,NN,,Hilfsassistent/in,"neues Projekt Herrmann, ab 2020",0%,0%,25%,25%,NEIN,0.4,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,18,?,?,DGK3014,H2020,NN,,doktorierende/r,"Europäisches Projekt, ab 2020",0%,0%,100%,100%,JA,1.0,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,19,?,?,?,?,NN 4,,?,"Research Adviser RISE, 2021",100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,20,?,?,?,?,NN 5,,?,"Research Adviser RISE, 2021",100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,21,?,?,?,?,NN 6,,?,"Research Adviser RISE, 2021",100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,22,?,?,?,?,NN 7,,?,"Research Adviser RISE, 2021",100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,23,?,?,?,?,NN 8,,?,"neues Projekt, anstelle weggefallerner 400% ?!**",0%,0%,50%,50%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,24,?,?,?,?,NN 9,,?,"neues Projekt, anstelle weggefallerner 400% ?!",0%,0%,50%,50%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,25,?,?,?,?,NN 10,,?,"neues Projekt, anstelle weggefallerner 400% ?!",0%,0%,50%,50%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,26,?,?,?,?,NN 11,,?,"neues Projekt, anstelle weggefallerner 400% ?!",0%,0%,50%,50%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,27,21071,22046,GX1102,Fakultärer Mittelpool Phil.-Hist.,Anna Diack,,Hilfsassistent/in,,12%,0%,0%,12%,NEIN,0.2,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,29,,,,Fakultärer Mittelpool Phil.-Hist.,Christian Weber,,Hilfsassistent/in,,12%,0%,0%,12%,NEIN,0.2,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,30,,,,PhD Programm DH,Vera Chiquet,,Wissensch. Mitarb.,,35%,0%,0%,35%,NEIN,0.6,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,31,,,,PhD Programm DH,Irene Kähli,,Administrativperson,,20%,0%,0%,20%,NEIN,0.3,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,32,,,,SNF Projekt,Thomas Messerli,,Wissensch. Mitarb.,,5%,0%,0%,5%,NEIN,0.1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,33,,,,SNF Projekt,Simone Rebora,,Hilfsassistent/in,,20%,0%,0%,20%,NEIN,0.3,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,34,,,,SNF Projekt,Lesther Zulauf,,Hilfsassistent/in,,12%,0%,0%,12%,NEIN,0.2,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,35,,,,Projekt KGS,Laura Citacu,,Hilfsassistent/in,,20%,0%,0%,20%,NEIN,0.3,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,*Fornaro / Rosenthaler ein Doppelbüro mit Besprechungsmöglichkeit.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,"**Beantragt sind derzeit diverse Projekte von B. Herrmann, G. Lauer, M. Kuijpers und P. Fornaro",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,Genauer tatsächlicher Personalbedarf ist derzeit unklar,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + +DHLab,,,,,,,,, +,,,2019,,,2020,,,2021-2024 +,,,,,,,,, +Kategorie,,Stellen,AP,,Stellen,AP,,Stellen,AP +,,,,,,,,, +Professoren,,2,2,,,,,, +Wiss. MA,,11,9,,,,,, +Assistierende,,8,6,,,,,, +Administration/Technik,,3,2,,,,,, +sonstige,,2,2,,,,,, +BSc,,0,0,,,,,, +MSc,,2,2,,,,,, +ohne Anspruch,,5,0,,,,,, +,,,,,,,,, +,,,,,,,,, +Summe,,33,23,0,0,0,0,0,0 + +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,DaSCH Ist Stellen 2019 (bis inkl. 3/2020),,,,"Quelle SAP 09/2019, Angaben DHLab/DaSCH 12/2019",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,, <,,,,,,,,,,,,,,,Personen,,,,,,,,,,,,,>, <,,,,,,,,Räume IST,,,,,,,>, <,,,,,Räume SOLL,,>, +,Index,Planstelle,Person-Vertrag,Kostenstelle CO-Objekt,,"Personenname +(Name, Vorname)",Personalkategorie ,Personalkategorie SAP,Organisationsstruktur DaSCH intern,"Finanzierung +Uni","Finanzierung +SNF","Finanzierung +Drittmittel",Beschäftigungsgrad %,persönlicher Arbeitsplatz,Arbeitsplatzanspruch,Funktionskategorie (FIM),Bürofläche m2,Raumtyp,"Übergeordnete +Organisationseinheit ","Untergeordnete +Organisationseinheit",Forschungsgruppe (deutsch),Abkürzungt (deu.),Forschungsgruppe (englisch),Abkürzungt (engl.),OE Ergänzung 2,Vorgänger,Austritt,Ausschreibung,Nachfolger,Antritt,"Arbeitsplatz 1 + Gebäude",Arbeitsplatz 1 Raumnummer,"Arbeitsplatz 1 + Fläche IST","Arbeitsplatz 1 + Fläche KORRIGIERT","Arbeitsplatz 1 +AP-Nr. WSW",Maximal-Belegung,Belegungsgrad,"Arbeitsplatz 2 + Gebäude",Arbeitsplatz 2 Raumnummer,"Arbeitsplatz 2 +Fläche","Arbeitsplatz 2 +AP-Nr. WSW","Labor +Gebäude","Labor +Raumnummer","Labor +Fläche","Gewächshaus +Ort","Infrastruktur +Art (soweit erf.)","Arbeitsplatz 1 SOLL + Gebäude",Arbeitsplatz 1 SOLL Raumnummer,"Arbeitsplatz 1 SOLL +Fläche ","Labor SOLL +Gebäude","Labor SOLL +Raumnummer","Labor SOLL +Fläche","Infrastruktur SOLL +Art (soweit erf.)","Infrastruktur SOLL +Ort",Bemerkungen +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,1,19823,44172,NGK2317,Data and Service Center for the Humanities,Chiquet Vera,,Wissensch. Mitarb.,US / Projektbetreuung,0%,55%,0%,55%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,2,?,?,NGK2317,Data and Service Center for the Humanities,Gautschy Rita ,,Wissensch. Mitarb.,TU / Schulung,0%,50%,0%,50%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,3,18983,31589,DGK2821,Data and Service Center for the Humanities,Geer Benjamin Lewis,,PostDoc,RaD / Entwicklung,0%,0%,100%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,4,18457,25388,DGK2821,Data and Service Center for the Humanities,Kilchenmann André,,PostDoc,RaD / Entwicklung,0%,0%,100%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,5,12455,45899,GK4805 / NGK2317,Digital Humanities Lab (10%)/ DaSCH(30%)*,Kuster Gabriela ,,Administrativperson,QM / Qualitätssicherung & ES / Sekretariat,10%,30%,0%,40%,JA,1.0,4,10.7,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,6,21726,47851,DGK3011,Data and Service Center for the Humanities (SUID),Laurens Flavie,,Wissensch. Mitarb.,RaD / Entwicklung,0%,100%,0%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,7,?,?,NGK2317,Data and Service Center for the Humanities,Nemmour Kathum ,,?,RaD / Entwicklung,0%,40%,0%,40%,NEIN,0.7,?,5.3,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,8,20375,2525,GK4805,Digital Humanities Lab,Rosenthaler Lukas,,Associate Professor,MD / Geschäftliche Leitung,50%,0%,0%,50%,JA,1,2,18,Einzelbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,9,18237,12713,NGK2317,Data and Service Center for the Humanities,Schweizer Tobias,,Wissensch. Mitarb.,RaD / Entwicklung,0%,80%,0%,80%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,10,15553,49131,NGK2317,Data and Service Center for the Humanities,Stöckli Lukas,,Hilfsassistent/in,Ops / Betrieb,0%,50%,0%,50%,JA,1,0,0,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,11,17825,8490,DGK2821,Data and Service Center for the Humanities,Subotic Ivan,,PostDoc,DoT / Technische Leitung,0%,0%,100%,100%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,12,21357,45669,DGK2821,Data and Service Center for the Humanities**,Tissaveerasingham Vijeinath,,Wissensch. Mitarb.,US / Projektbetreuung,0%,0%,20%,20%,JA,1.0,6,2.7,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,13,20728,41647,NGK2317,Data and Service Center for the Humanities,Zbinden Erwin,,Wissensch. Mitarb.,DoF / Administrative Leitung,0%,50%,0%,50%,JA,1,6,8,Mehrplatzbüro,Dekanat Phil. Historische Fakultät,Digital Humanities Lab,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,835%,,13,,101,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,"*Derzeit total 80%: 30% für DaSCH direkt und 50% für DHLab admin, wovon 10% für DaSCH-Admin anfällt. Beides am gleichen Arbeitsplatz",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,"** Derzeit Total 100%: 20% für DaSCH direkt, 80% für ein SNF-Projekt mit DaSCH-Bezug. Beides am gleichen Arbeitsplatz",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + + +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,DaSCH Soll Stellen 2020,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,, <,,,,,,,,,,,,,,,Personen,,,,,,,,,,,,,>, <,,,,,,,,Räume IST,,,,,,,>, <,,,,,Räume SOLL,,>, +,Index,Planstelle,Person-Vertrag,Kostenstelle CO-Objekt,,"Personenname +(Name, Vorname)",Personalkategorie ,Personalkategorie SAP,Organisationsstruktur DaSCH intern,"Finanzierung +Uni","Finanzierung +SNF","Finanzierung +Drittmittel",Beschäftigungsgrad %,persönlicher Arbeitsplatz,Arbeitsplatzanspruch,Funktionskategorie (FIM),Bürofläche m2,Raumtyp,"Übergeordnete +Organisationseinheit ","Untergeordnete +Organisationseinheit",Forschungsgruppe (deutsch),Abkürzungt (deu.),Forschungsgruppe (englisch),Abkürzungt (engl.),OE Ergänzung 2,Vorgänger,Austritt,Ausschreibung,Nachfolger,Antritt,"Arbeitsplatz 1 + Gebäude",Arbeitsplatz 1 Raumnummer,"Arbeitsplatz 1 + Fläche IST","Arbeitsplatz 1 + Fläche KORRIGIERT","Arbeitsplatz 1 +AP-Nr. WSW",Maximal-Belegung,Belegungsgrad,"Arbeitsplatz 2 + Gebäude",Arbeitsplatz 2 Raumnummer,"Arbeitsplatz 2 +Fläche","Arbeitsplatz 2 +AP-Nr. WSW","Labor +Gebäude","Labor +Raumnummer","Labor +Fläche","Gewächshaus +Ort","Infrastruktur +Art (soweit erf.)","Arbeitsplatz 1 SOLL + Gebäude",Arbeitsplatz 1 SOLL Raumnummer,"Arbeitsplatz 1 SOLL +Fläche ","Labor SOLL +Gebäude","Labor SOLL +Raumnummer","Labor SOLL +Fläche","Infrastruktur SOLL +Art (soweit erf.)","Infrastruktur SOLL +Ort",Bemerkungen +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,1,?,?,?,?,Alassi Sepideh,,Doktorierende/r,RaD / Entwicklung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,2,?,?,?,?,Chiquet Vera,,Wissensch. Mitarb.,US / Projektbetreuung,55%,0%,0%,55%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,3,?,?,?,?,Delez Michael ,,?,RaD / Entwicklung,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,4,?,?,?,?,Gautschy Rita ,,Wissensch. Mitarb.,TU / Schulung,50%,0%,0%,50%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,5,?,?,?,?,Geer Benjamin Lewis,,PostDoc,RaD / Entwicklung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,6,?,?,?,?,Kilchenmann André,,PostDoc,RaD / Entwicklung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,7,?,?,?,?,Kuster Gabriela ,,Administrativperson,QM / Qualitätssicherung & ES / Sekretariat,50%,0%,0%,50%,JA,1,4,13.3,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,8,?,?,?,?,Laurens Flavie,,Wissensch. Mitarb.,RaD / Entwicklung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,9,?,?,?,?,Nemmour Kathum ,,?,RaD / Entwicklung,50%,0%,0%,50%,JA,0.8,?,6.7,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,10,?,?,?,?,Rosenthaler Lukas,,Associate Professor,MD / Geschäftliche Leitung,50%,0%,0%,50%,JA,1,6,18,Einzelbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,11,?,?,?,?,Schweizer Tobias,,Wissensch. Mitarb.,RaD / Entwicklung,90%,0%,0%,90%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,12,?,?,?,?,Stöckli Lukas,,Hilfsassistent/in,Ops / Betrieb,70%,0%,0%,70%,JA,1,0,0,-,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,13,?,?,?,?,Subotic Daniela ,,?,US / Projektbetreuung,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,14,?,?,?,?,Subotic Ivan,,PostDoc,DoT / Technische Leitung,100%,0%,0%,100%,JA,1,6,8,Einzelbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,15,?,?,?,?,Tissaveerasingham Vijeinath,,Wissensch. Mitarb.,US / Projektbetreuung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,16,?,?,?,?,Peter Fornaro,,Wissensch. Mitarb.,DoF / Administrative Leitung,50%,0%,0%,50%,JA,1,6,8,Einzelbürop,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,17,?,?,?,?,NN 1,,Administrativperson,ES / Sekretariat,20%,0%,0%,20%,NEIN,0.3,4,2.7,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,1285%,,16,,137,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + + +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,DaSCH Soll Stellen 2021-2024,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,, <,,,,,,,,,,,,,,,Personen,,,,,,,,,,,,,>, <,,,,,,,,Räume IST,,,,,,,>, <,,,,,Räume SOLL,,>, +,Index,Planstelle,Person-Vertrag,Kostenstelle CO-Objekt,,"Personenname +(Name, Vorname)",Personalkategorie ,Personalkategorie SAP,Organisationsstruktur DaSCH intern,"Finanzierung +Uni","Finanzierung +SNF","Finanzierung +Drittmittel",Beschäftigungsgrad %,persönlicher Arbeitsplatz,Arbeitsplatzanspruch,Funktionskategorie (FIM),Bürofläche m2,Raumtyp,"Übergeordnete +Organisationseinheit ","Untergeordnete +Organisationseinheit",Forschungsgruppe (deutsch),Abkürzungt (deu.),Forschungsgruppe (englisch),Abkürzungt (engl.),OE Ergänzung 2,Vorgänger,Austritt,Ausschreibung,Nachfolger,Antritt,"Arbeitsplatz 1 + Gebäude",Arbeitsplatz 1 Raumnummer,"Arbeitsplatz 1 + Fläche IST","Arbeitsplatz 1 + Fläche KORRIGIERT","Arbeitsplatz 1 +AP-Nr. WSW",Maximal-Belegung,Belegungsgrad,"Arbeitsplatz 2 + Gebäude",Arbeitsplatz 2 Raumnummer,"Arbeitsplatz 2 +Fläche","Arbeitsplatz 2 +AP-Nr. WSW","Labor +Gebäude","Labor +Raumnummer","Labor +Fläche","Gewächshaus +Ort","Infrastruktur +Art (soweit erf.)","Arbeitsplatz 1 SOLL + Gebäude",Arbeitsplatz 1 SOLL Raumnummer,"Arbeitsplatz 1 SOLL +Fläche ","Labor SOLL +Gebäude","Labor SOLL +Raumnummer","Labor SOLL +Fläche","Infrastruktur SOLL +Art (soweit erf.)","Infrastruktur SOLL +Ort",Bemerkungen +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,1,?,?,?,?,Alassi Sepideh,,Doktorierende/r,RaD / Entwicklung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,2,?,?,?,?,Chiquet Vera,,Wissensch. Mitarb.,US / Projektbetreuung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,3,?,?,?,?,Delez Michael ,,?,RaD / Entwicklung,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,4,?,?,?,?,Gautschy Rita ,,Wissensch. Mitarb.,TU / Schulung,50%,0%,0%,50%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,5,?,?,?,?,Geer Benjamin Lewis,,PostDoc,RaD / Entwicklung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,6,?,?,?,?,Kilchenmann André,,PostDoc,RaD / Entwicklung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,7,?,?,?,?,Kuster Gabriela ,,Administrativperson,QM / Qualitätssicherung & ES / Sekretariat,70%,0%,0%,70%,JA,1,4,16,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,8,?,?,?,?,Laurens Flavie,,Wissensch. Mitarb.,RaD / Entwicklung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,9,?,?,?,?,Nemmour Kathum ,,?,RaD / Entwicklung,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,10,?,?,?,?,Rosenthaler Lukas,,Associate Professor,MD / Geschäftliche Leitung,50%,0%,0%,50%,JA,1,6,18,Einzelbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,11,?,?,?,?,Schweizer Tobias,,Wissensch. Mitarb.,RaD / Entwicklung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,12,?,?,?,?,Stöckli Lukas,,Hilfsassistent/in,Ops / Betrieb,100%,0%,0%,100%,JA,1,0,0,-,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,13,?,?,?,?,Subotic Daniela ,,?,US / Projektbetreuung,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,14,?,?,?,?,Subotic Ivan,,PostDoc,DoT / Technische Leitung,100%,0%,0%,100%,JA,1,6,8,Einzelbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,15,?,?,?,?,Tissaveerasingham Vijeinath,,Wissensch. Mitarb.,US / Projektbetreuung,100%,0%,0%,100%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,16,?,?,?,?,Fornaro Peter,,Wissensch. Mitarb.,DoF / Administrative Leitung,100%,0%,0%,100%,JA,1,6,8,Einzelbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,17,?,?,?,?,NN 1,,Administrativperson,ES / Sekretariat,80%,0%,0%,80%,JA,1,4,16,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,18,?,?,?,?,NN 2,,?,RaD / Entwicklung,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,19,?,?,?,?,NN 3,,?,Ops / Betrieb,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,20,?,?,?,?,NN 4,,?,Ops / Betrieb,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,21,?,?,?,?,NN 5,,Wissensch. Mitarb.,TU / Schulung,50%,0%,0%,50%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,22,?,?,?,?,NN 6,,Wissensch. Mitarb.,QM / Qualitätssicherung,50%,0%,0%,50%,JA,1,6,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,23,?,?,?,?,NN 7 (Eric Sommerhalder) ,,?,US / Projektbetreuung,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,24,?,?,?,?,NN 8,,?,US / Projektbetreuung,100%,0%,0%,100%,JA,1,?,8,Mehrplatzbüro,?,?,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,NN 9,,Administrativperson,Dariah Geschäftsstelle Schweiz (bekannt seit 9.12.2019),0%,0%,60%,60%,JA,1,?,8,Mehrplatzbüro,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,1470%,,25,,218,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, + +,,,, diff --git a/knora/bitstreams/test.pdf b/knora/bitstreams/test.pdf new file mode 100644 index 000000000..aaa1073ac Binary files /dev/null and b/knora/bitstreams/test.pdf differ diff --git a/knora/bitstreams/test.zip b/knora/bitstreams/test.zip new file mode 100644 index 000000000..65e316df6 Binary files /dev/null and b/knora/bitstreams/test.zip differ diff --git a/knora/dsp_tools.py b/knora/dsp_tools.py index 3b6d3e0eb..e1c64b05e 100644 --- a/knora/dsp_tools.py +++ b/knora/dsp_tools.py @@ -16,37 +16,40 @@ def program(args): # parse the arguments of the command line # parser = argparse.ArgumentParser( - description="A program to create and manipulate ontologies based on the DaSCH Service Platform and Knora" + description="A program to create and manipulate ontologies based on the DaSCH Service Platform" ) + subparsers = parser.add_subparsers(title="Subcommands", description='Valid subcommands are', help='sub-command help') parser_create = subparsers.add_parser('create', help='Create ontologies, lists etc.') parser_create.set_defaults(action="create") - parser_create.add_argument("-s", "--server", type=str, default="http://0.0.0.0:3333", help="URL of the Knora server") - parser_create.add_argument("-u", "--user", default="root@example.com", help="Username for Knora") + parser_create.add_argument("-s", "--server", type=str, default="http://0.0.0.0:3333", help="URL of the DSP server") + parser_create.add_argument("-u", "--user", default="root@example.com", help="Username for DSP server") parser_create.add_argument("-p", "--password", default="test", help="The password for login") parser_create.add_argument("-V", "--validate", action='store_true', help="Do only validation of JSON, no upload of the ontology") parser_create.add_argument("datamodelfile", help="path to data model file") parser_create.add_argument("-L", "--listfile", type=str, default="lists.json", help="Name of list node informationfile") parser_create.add_argument("-l", "--lists", action='store_true', help="Only create the lists") parser_create.add_argument("-v", "--verbose", action="store_true", help="Verbose feedback") + parser_create.add_argument("-d", "--dump", action="store_true", help="dump test files for DSP-API requests") parser_get = subparsers.add_parser('get', help='Get project/ontology information from server') parser_get.set_defaults(action="get") - parser_get.add_argument("-u", "--user", default="root@example.com", help="Username for Knora") + parser_get.add_argument("-u", "--user", default="root@example.com", help="Username for DSP server") parser_get.add_argument("-p", "--password", default="test", help="The password for login") - parser_get.add_argument("-s", "--server", type=str, default="http://0.0.0.0:3333", help="URL of the Knora server") + parser_get.add_argument("-s", "--server", type=str, default="http://0.0.0.0:3333", help="URL of the DSP server") parser_get.add_argument("-P", "--project", type=str, help="Shortcode, shortname or iri of project", required=True) parser_get.add_argument("outfile", help="path to data model file", default="onto.json") parser_get.add_argument("-v", "--verbose", action="store_true", help="Verbose feedback") parser_upload = subparsers.add_parser('xmlupload', help='Upload data from XML file to server') parser_upload.set_defaults(action="xmlupload") - parser_upload.add_argument("-u", "--user", type=str, default="root@example.com", help="Username for Knora") + parser_upload.add_argument("-s", "--server", type=str, default="http://0.0.0.0:3333", help="URL of the DSP server") + parser_upload.add_argument("-u", "--user", type=str, default="root@example.com", help="Username for DSP server") parser_upload.add_argument("-p", "--password", type=str, default="test", help="The password for login") - parser_upload.add_argument("-s", "--server", type=str, default="http://0.0.0.0:3333", help="URL of the Knora server") + parser_upload.add_argument("-V", "--validate", action='store_true', help="Do only validation of JSON, no upload of the ontology") parser_upload.add_argument("-i", "--imgdir", type=str, default=".", help="Path to folder containing the images") parser_upload.add_argument("-S", "--sipi", type=str, default="http://0.0.0.0:1024", help="URL of SIPI server") parser_upload.add_argument("xmlfile", help="path to xml file containing the data", default="data.xml") @@ -54,17 +57,22 @@ def program(args): args = parser.parse_args(args) + if not hasattr(args, 'action'): + parser.print_help(sys.stderr) + exit(0) + if args.action == "create": if args.lists: if args.validate: validate_list(args.datamodelfile) else: - create_lists(args.datamodelfile, args.listfile) + create_lists(args.datamodelfile, args.dump) else: if args.validate: validate_ontology(args.datamodelfile) else: - create_ontology(args.datamodelfile, args.listfile, args.server, args.user, args.password, args.verbose) + create_ontology(args.datamodelfile, args.listfile, args.server, args.user, args.password, args.verbose, + args.dump if args.dump else False) elif args.action == "get": get_ontology(args.project, args.outfile, args.server, args.user, args.password, args.verbose) elif args.action == "xmlupload": @@ -74,7 +82,8 @@ def program(args): password=args.password, imgdir=args.imgdir, sipi=args.sipi, - verbose=args.verbose) + verbose=args.verbose, + validate=args.validate) diff --git a/knora/dsplib/models/connection.py b/knora/dsplib/models/connection.py index 840884855..e1d058839 100644 --- a/knora/dsplib/models/connection.py +++ b/knora/dsplib/models/connection.py @@ -5,7 +5,6 @@ from .helpers import Actions, BaseError - @strict class Connection: """ @@ -17,9 +16,10 @@ class Connection: none (internal use attributes should not be modified/set directly) """ - server: str - prefixes: Union[Dict[str, str], None] - token: Union[str, None] + _server: str + _prefixes: Union[Dict[str, str], None] + _token: Union[str, None] + _log: bool def __init__(self, server: str, prefixes: Dict[str, str] = None): """ @@ -28,9 +28,10 @@ def __init__(self, server: str, prefixes: Dict[str, str] = None): :param prefixes: Ontology prefixes used """ - self.server = server - self.prefixes = prefixes - self.token = None + self._server = server + self._prefixes = prefixes + self._token = None + self._log = False def login(self, email: str, password: str) -> None: """ @@ -46,13 +47,13 @@ def login(self, email: str, password: str) -> None: jsondata = json.dumps(credentials) req = requests.post( - self.server + '/v2/authentication', + self._server + '/v2/authentication', headers={'Content-Type': 'application/json; charset=UTF-8'}, data=jsondata ) self.on_api_error(req) result = req.json() - self.token = result["token"] + self._token = result["token"] def get_token(self) -> str: """ @@ -60,7 +61,17 @@ def get_token(self) -> str: :return: token string """ - return self.token + return self._token + + @property + def token(self) -> str: + return self._token + + def start_logging(self): + self._log = True + + def stop_logging(self): + self._log = False def logout(self) -> None: """ @@ -68,13 +79,13 @@ def logout(self) -> None: :return: None """ - if self.token is not None: + if self._token is not None: req = requests.delete( - self.server + '/v2/authentication', - headers={'Authorization': 'Bearer ' + self.token} + self._server + '/v2/authentication', + headers={'Authorization': 'Bearer ' + self._token} ) self.on_api_error(req) - self.token = None + self._token = None def __del__(self): pass @@ -103,22 +114,44 @@ def post(self, path: str, jsondata: Optional[str] = None): if path[0] != '/': path = '/' + path + headers = None if jsondata is None: - if self.token is not None: - req = requests.post(self.server + path, - headers={'Authorization': 'Bearer ' + self.token}) + if self._token is not None: + headers = {'Authorization': 'Bearer ' + self._token} + req = requests.post(self._server + path, + headers=headers) else: - req = requests.post(self.server + path) + req = requests.post(self._server + path) else: - if self.token is not None: - req = requests.post(self.server + path, - headers={'Content-Type': 'application/json; charset=UTF-8', - 'Authorization': 'Bearer ' + self.token}, + if self._token is not None: + headers = {'Content-Type': 'application/json; charset=UTF-8', + 'Authorization': 'Bearer ' + self._token} + req = requests.post(self._server + path, + headers=headers, data=jsondata) else: - req = requests.post(self.server + path, - headers={'Content-Type': 'application/json; charset=UTF-8'}, + headers = {'Content-Type': 'application/json; charset=UTF-8'} + req = requests.post(self._server + path, + headers=headers, data=jsondata) + if self._log: + if jsondata: + jsonobj = json.loads(jsondata) + else: + jsonobj = None + logobj = { + "method": "POST", + "headers": headers, + "route": path, + "body": jsonobj, + "return-headers": dict(req.headers), + "return": req.json() if req.status_code == 200 else {"status": str(req.status_code), + "message": req.text} + } + tmp = path.split('/') + filename = "POST" + "_".join(tmp) + ".json" + with open(filename, 'w') as f: + json.dump(logobj, f, indent=3) self.on_api_error(req) result = req.json() return result @@ -133,18 +166,18 @@ def get(self, path: str, headers: Optional[Dict[str, str]] = None): if path[0] != '/': path = '/' + path - if self.token is None: + if self._token is None: if headers is None: - req = requests.get(self.server + path) + req = requests.get(self._server + path) else: - req = requests.get(self.server + path, headers) + req = requests.get(self._server + path, headers) else: if headers is None: - req = requests.get(self.server + path, - headers={'Authorization': 'Bearer ' + self.token}) + req = requests.get(self._server + path, + headers={'Authorization': 'Bearer ' + self._token}) else: - headers['Authorization'] = 'Bearer ' + self.token - req = requests.get(self.server + path, headers) + headers['Authorization'] = 'Bearer ' + self._token + req = requests.get(self._server + path, headers) self.on_api_error(req) result = req.json() @@ -162,12 +195,12 @@ def put(self, path: str, jsondata: Optional[str] = None, content_type: str = 'ap if path[0] != '/': path = '/' + path if jsondata is None: - req = requests.put(self.server + path, - headers={'Authorization': 'Bearer ' + self.token}) + req = requests.put(self._server + path, + headers={'Authorization': 'Bearer ' + self._token}) else: - req = requests.put(self.server + path, + req = requests.put(self._server + path, headers={'Content-Type': content_type + '; charset=UTF-8', - 'Authorization': 'Bearer ' + self.token}, + 'Authorization': 'Bearer ' + self._token}, data=jsondata) self.on_api_error(req) result = req.json() @@ -183,13 +216,13 @@ def delete(self, path: str, params: Optional[any] = None): if path[0] != '/': path = '/' + path if params is not None: - req = requests.delete(self.server + path, - headers={'Authorization': 'Bearer ' + self.token}, + req = requests.delete(self._server + path, + headers={'Authorization': 'Bearer ' + self._token}, params=params) else: - req = requests.delete(self.server + path, - headers={'Authorization': 'Bearer ' + self.token}) + req = requests.delete(self._server + path, + headers={'Authorization': 'Bearer ' + self._token}) self.on_api_error(req) result = req.json() return result @@ -230,7 +263,7 @@ def reset_triplestore_content(self): } ] jsondata = json.dumps(rdfdata) - url = self.server + '/admin/store/ResetTriplestoreContent?prependdefaults=false' + url = self._server + '/admin/store/ResetTriplestoreContent?prependdefaults=false' req = requests.post(url, headers={'Content-Type': 'application/json; charset=UTF-8'}, diff --git a/knora/dsplib/models/helpers.py b/knora/dsplib/models/helpers.py index f064d8e32..a37fb7ac2 100644 --- a/knora/dsplib/models/helpers.py +++ b/knora/dsplib/models/helpers.py @@ -259,6 +259,7 @@ def add_context(self, prefix: str, iri: Optional[str] = None) -> None: self._context[prefix] = OntoInfo(iri, False) self._rcontext[iri] = prefix + def iri_from_prefix(self, prefix: str) -> Optional[str]: """ Returns the full IRI belonging to this prefix, without trailing "#"! diff --git a/knora/dsplib/models/listnode.py b/knora/dsplib/models/listnode.py index 3c1925734..cad444265 100644 --- a/knora/dsplib/models/listnode.py +++ b/knora/dsplib/models/listnode.py @@ -448,7 +448,12 @@ def read(self) -> Any: """ result = self._con.get('/admin/lists/nodes/' + quote_plus(self._id)) - return self.fromJsonObj(self._con, result['nodeinfo']) + if result.get('nodeinfo'): + return self.fromJsonObj(self._con, result['nodeinfo']) + elif result.get('listinfo'): + return self.fromJsonObj(self._con, result['listinfo']) + else: + return None def update(self) -> Union[Any, None]: """ diff --git a/knora/dsplib/models/project.py b/knora/dsplib/models/project.py index 5c8677dd3..bb0198110 100644 --- a/knora/dsplib/models/project.py +++ b/knora/dsplib/models/project.py @@ -8,6 +8,7 @@ from .connection import Connection from .model import Model +from pprint import pprint class SetEncoder(json.JSONEncoder): def default(self, obj): @@ -442,7 +443,7 @@ def read(self) -> 'Project': if result is not None: return Project.fromJsonObj(self._con, result['project']) else: - return None + return None # Todo: throw exception def update(self) -> Union['Project', None]: """ @@ -469,6 +470,41 @@ def delete(self) -> 'Project': result = self._con.delete('/admin/projects/iri/' + quote_plus(self._id)) return Project.fromJsonObj(self._con, result['project']) + def set_default_permissions(self, group_id: str) -> None: + permobj = { + "forGroup": "http://www.knora.org/ontology/knora-admin#ProjectMember", + "forProject": self._id, + "hasPermissions": [ + { + "additionalInformation": None, + "name": "ProjectResourceCreateAllPermission", + "permissionCode": None + } + ] + } + jsondata = json.dumps(permobj, indent=4) + print(jsondata) + result = self._con.post("/admin/permissions/ap", jsondata) + pprint(result) + + return + permobj = { + "forGroup": group_id, + "forProject": self._id, + "forProperty": None, + "forResourceClass": None, + "hasPermissions": [ + { + "additionalInformation": "http://www.knora.org/ontology/knora-admin#ProjectMember", + "name": "D", + "permissionCode": 7 + } + ] + } + jsondata = json.dumps(permobj) + result = self._con.post("/admin/permissions/ap", jsondata) + pprint(result) + @staticmethod def getAllProjects(con: Connection) -> List['Project']: """ diff --git a/knora/dsplib/models/resource.py b/knora/dsplib/models/resource.py index 7772605bd..80941a8d6 100644 --- a/knora/dsplib/models/resource.py +++ b/knora/dsplib/models/resource.py @@ -26,6 +26,7 @@ from pprint import pprint + class KnoraStandoffXmlEncoder(json.JSONEncoder): """Classes used as wrapper for knora standoff-XML""" def default(self, obj) -> str: @@ -45,13 +46,24 @@ class Propinfo: @strict class ResourceInstance(Model): + baseclasses_with_bitstream: Set[str] = { + 'StillImageRepresentation', + 'AudioRepresentation', + 'DocumentRepresentation', + 'MovingImageRepresentation', + 'DDDRepresentation', + 'TextRepresentation'} + knora_properties: Set[str] = { + "knora-api:isPartOf", + "knora-api:seqnum", + } _iri: Union[str, None] _ark: Union[str, None] _vark: Union[str, None] _label: Union[str, None] _permissions: Union[Permissions, None] _upermission: Union[PermissionValue, None] - _stillimage: Union[str, None] + _bitstream: Union[str, None] _values: Union[Dict[Value, List[Value]], None] def __init__(self, @@ -62,7 +74,7 @@ def __init__(self, label: Optional[str] = None, permissions: Optional[Permissions] = None, upermission: Optional[PermissionValue] = None, - stillimage: Optional[str] = None, + bitstream: Optional[str] = None, values: Optional[Dict[str, Union[str, List[str], Dict[str, str], List[Dict[str,str]], Value, List[Value]]]] = None): super().__init__(con) self._iri = iri @@ -71,14 +83,15 @@ def __init__(self, self._vark = vark self._permissions = permissions self._upermission = upermission - if self.baseclass == 'StillImageRepresentation' and stillimage is None: - raise BaseError("The baseclass \"StillImageRepresentation\" requires a stillimage value!") - if self.baseclass != 'StillImageRepresentation' and stillimage is not None: - raise BaseError("The baseclass \"{}\" does not allow a stillimage value!".format(self.baseclass)) - if self.baseclass == 'StillImageRepresentation' and stillimage is not None: - self._stillimage = stillimage + + if self.baseclass in self.baseclasses_with_bitstream and bitstream is None: + raise BaseError("The baseclass \"{}\" requires a bitstream value!".format(self.baseclass)) + if self.baseclass not in self.baseclasses_with_bitstream and bitstream is not None: + raise BaseError("The baseclass \"{}\" does not allow a bitstream value!".format(self.baseclass)) + if self.baseclass in self.baseclasses_with_bitstream and bitstream is not None: + self._bitstream = bitstream else: - self._stillimage = None + self._bitstream = None self._values = {} if values: @@ -92,7 +105,7 @@ def __init__(self, self._values[propname] = [] for val in vals: if valcnt > 0 and (propinfo.cardinality == Cardinality.C_0_1 or propinfo.cardinality == Cardinality.C_1): - raise BaseError("Cardinality does not allow multiple values for \"{}\"!".format(propname)) + raise BaseError(f'Cardinality does not allow multiple values for "{propname}"!') if type(val) is Value: self._values[propname].append(val) elif type(val) is dict: @@ -119,8 +132,8 @@ def __init__(self, if propinfo.cardinality == Cardinality.C_1 or propinfo.cardinality == Cardinality.C_1_n: raise BaseError("Cardinality does require at least one value for \"{}\"!".format(propname)) for propname in values: - if self.properties.get(propname) is None: - raise BaseError("Property \"{}\" is not part of data model!".format(propname)) + if propname not in self.knora_properties and self.properties.get(propname) is None: + raise BaseError(f'Property "{propname}" is not part of data model!') @property def iri(self) -> str: @@ -183,11 +196,29 @@ def toJsonLdObj(self, action: Actions) -> Any: tmp['rdfs:label'] = self._label if self._permissions: tmp["knora-api:hasPermissions"] = self._permissions.toJsonLdObj() - if self._stillimage: - tmp["knora-api:hasStillImageFileValue"] = { - "@type": "knora-api:StillImageFileValue", - "knora-api:fileValueHasFilename": self._stillimage - } + if self._bitstream: + if self.baseclass == 'StillImageRepresentation': + tmp["knora-api:hasStillImageFileValue"] = { + "@type": "knora-api:StillImageFileValue", + "knora-api:fileValueHasFilename": self._bitstream + } + elif self.baseclass == 'DocumentRepresentation': + tmp["knora-api:hasDocumentFileValue"] = { + "@type": "knora-api:DocumentFileValue", + "knora-api:fileValueHasFilename": self._bitstream + } + elif self.baseclass == 'TextRepresentation': + tmp["knora-api:hasTextFileValue"] = { + "@type": "knora-api:TextFileValue", + "knora-api:fileValueHasFilename": self._bitstream + } + elif self.baseclass == 'AudioRepresentation': + tmp["knora-api:hasAudioFileValue"] = { + "@type": "knora-api:AudioFileValue", + "knora-api:fileValueHasFilename": self._bitstream + } + else: + raise BaseError(f'Baseclass "{self.baseclass}" not yet supported!') for propname, valtype in self._values.items(): if type(valtype) is list: if type(valtype[0]) is LinkValue: @@ -208,7 +239,7 @@ def toJsonLdObj(self, action: Actions) -> Any: def create(self): jsonobj = self.toJsonLdObj(Actions.Create) jsondata = json.dumps(jsonobj, indent=4, separators=(',', ': '), cls=KnoraStandoffXmlEncoder) - print(jsondata) + #print(jsondata) result = self._con.post('/v2/resources', jsondata) newinstance = self.clone() newinstance._iri = result['@id'] @@ -243,6 +274,19 @@ def print(self): print(name, ':', str(val)) +# ToDo: special resourceclasses and properties of knora-api +# +# - knora-api:isPartOf -> Object: knora-api:Resource +# - knora-api:author -> Object: knora-api:User +# - knora-api:seqnum -> Object: knora-api:IntValue +# - knora-api:hasComment -> Object: knora-api:TextValue +# +# knora-api:Region: IS a resource +# - knora-api:hasGeometry +# - knora-api:isRegionOf +# - knora-api:hasColor +# - knora-api:hasComment + @strict class ResourceInstanceFactory: _con: Connection @@ -333,7 +377,22 @@ def get_resclass(self, prefixedresclass: str) -> Type: 'knora-api:LinkValue': LinkValue, } for propname, has_property in resclass.has_properties.items(): - if has_property.ptype == HasProperty.Ptype.other: + if propname == "knora-api:isPartOf": + valtype = LinkValue + props[propname] = Propinfo(valtype=valtype, + cardinality=has_property.cardinality, + gui_order=has_property.gui_order) + elif propname == "knora-api:seqnum": + valtype = IntValue + props[propname] = Propinfo(valtype=valtype, + cardinality=has_property.cardinality, + gui_order=has_property.gui_order) + elif propname == "knora-api:hasComment": + valtype = TextValue + props[propname] = Propinfo(valtype=valtype, + cardinality=has_property.cardinality, + gui_order=has_property.gui_order) + elif has_property.ptype == HasProperty.Ptype.other: valtype = switcher.get(self._properties[propname].object) if valtype == LinkValue: continue # we have the Link to the LinkValue which we do not use diff --git a/knora/dsplib/models/resourceclass.py b/knora/dsplib/models/resourceclass.py index 36ddce3c7..9ede97572 100644 --- a/knora/dsplib/models/resourceclass.py +++ b/knora/dsplib/models/resourceclass.py @@ -56,6 +56,8 @@ def __init__(self, self._context = context if ontology_id is not None: self._ontology_id = context.iri_from_prefix(ontology_id) + else: + self._ontology_id = None self._property_id = property_id self._resclass_id = resclass_id self._cardinality = cardinality @@ -81,7 +83,7 @@ def property_id(self) -> Optional[str]: @property_id.setter def property_id(self, value: str) -> None: - raise BaseError('"property_id" cannot be modified!') + raise BaseError('property_id "{}" cannot be modified!'.format(self._property_id)) @property def resclass_id(self) -> Optional[str]: @@ -577,12 +579,12 @@ def addProperty(self, cardinality=cardinality, gui_order=gui_order).create(last_modification_date) hp = resclass.getProperty(property_id) - hp.ontology_id = self._context.iri_from_prefix(self._ontology_id) - hp.resclass_id = self._id + hp._ontology_id = self._context.iri_from_prefix(self._ontology_id) + hp._resclass_id = self._id self._has_properties[hp.property_id] = hp return latest_modification_date else: - raise BaseError("Property already has cardinality in this class!") + raise BaseError("Property already has cardinality in this class! " + property_id) def updateProperty(self, last_modification_date: LastModificationDate, @@ -725,7 +727,6 @@ def resolve_resref(resref: str): def create(self, last_modification_date: LastModificationDate) -> Tuple[LastModificationDate, 'ResourceClass']: jsonobj = self.toJsonObj(last_modification_date, Actions.Create) jsondata = json.dumps(jsonobj, cls=SetEncoder, indent=4) - print(jsondata) result = self._con.post('/v2/ontologies/classes', jsondata) last_modification_date = LastModificationDate(result['knora-api:lastModificationDate']) return last_modification_date, ResourceClass.fromJsonObj(self._con, self._context, result['@graph']) diff --git a/knora/dsplib/models/sipi.py b/knora/dsplib/models/sipi.py index a0c82536f..5cb0d3e8f 100644 --- a/knora/dsplib/models/sipi.py +++ b/knora/dsplib/models/sipi.py @@ -1,7 +1,11 @@ import requests from .helpers import BaseError +import os + class Sipi: + + def __init__(self, sipiserver: str, token: str): self.sipiserver = sipiserver self.token = token @@ -19,9 +23,10 @@ def on_api_error(self, res): if 'error' in res: raise BaseError("SIPI-ERROR: API error: " + res.error) - def upload_image(self, filepath): + def upload_bitstream(self, filepath): + print(f"filepath=${os.path.basename(filepath)} (${filepath})") files = { - 'file': (filepath, open(filepath, 'rb')), + 'file': (os.path.basename(filepath), open(filepath, 'rb')), } req = requests.post(self.sipiserver + "/upload?token=" + self.token, files=files) diff --git a/knora/dsplib/models/value.py b/knora/dsplib/models/value.py index 1ce09116f..5b5eaeb83 100644 --- a/knora/dsplib/models/value.py +++ b/knora/dsplib/models/value.py @@ -835,7 +835,6 @@ def __init__(self, def find_listnode(nodes: List[ListNode], name: str) -> Union[str, None]: for node in nodes: - print('node.name=', node.name, ' name=', name) if node.name == name: return node.id else: @@ -863,7 +862,6 @@ def find_listnode(nodes: List[ListNode], name: str) -> Union[str, None]: for list in lists: if list.name == listname: node_iri = find_listnode(list.children, nodename) - print('=====>', node_iri) if node_iri is not None: self._value = node_iri else: diff --git a/knora/dsplib/utils/knora-data-schema.xsd b/knora/dsplib/utils/knora-data-schema.xsd index f23488ece..208c27bcc 100644 --- a/knora/dsplib/utils/knora-data-schema.xsd +++ b/knora/dsplib/utils/knora-data-schema.xsd @@ -335,6 +335,13 @@ + + + + + + + @@ -342,10 +349,40 @@ + + + + + + + + + + + + + + + + + + + + + - - + + + + + + @@ -362,6 +399,8 @@ + + diff --git a/knora/dsplib/utils/knora-schema.json b/knora/dsplib/utils/knora-schema.json index 0ed5e1428..008b18057 100644 --- a/knora/dsplib/utils/knora-schema.json +++ b/knora/dsplib/utils/knora-schema.json @@ -232,7 +232,10 @@ "TimeValue", "UriValue", "IntervalValue", - "ListValue" + "ListValue", + "Region", + "Resource", + "Annotation" ] }, { @@ -325,7 +328,14 @@ "properties": { "propname": { "type": "string", - "pattern": "^(([\\w-]*)?:([\\w ]+))$" + "oneOf": [ + { + "enum": ["Region", "isPartOf", "seqnum"] + }, + { + "pattern": "^(([\\w-]*)?:([\\w ]+))$" + } + ] }, "cardinality": { "type": "string", diff --git a/knora/dsplib/utils/onto_create_ontology.py b/knora/dsplib/utils/onto_create_ontology.py index 95a18c810..877028c7c 100644 --- a/knora/dsplib/utils/onto_create_ontology.py +++ b/knora/dsplib/utils/onto_create_ontology.py @@ -22,7 +22,8 @@ def create_ontology(input_file: str, server: str, user: str, password: str, - verbose: bool) -> bool: + verbose: bool, + dump: bool) -> bool: current_dir = os.path.dirname(os.path.realpath(__file__)) # let's read the schema for the data model definition @@ -43,12 +44,15 @@ def create_ontology(input_file: str, # con = Connection(server) con.login(user, password) + if dump: + con.start_logging() # -------------------------------------------------------------------------- # let's read the prefixes of external ontologies that may be used # context = Context(datamodel["prefixes"]) + # -------------------------------------------------------------------------- # Let's create the project... # @@ -149,7 +153,7 @@ def create_ontology(input_file: str, if verbose: print("Groups:") new_group.print() - + #project.set_default_permissions(new_group.id) # -------------------------------------------------------------------------- # now let's add the users (if there are users defined...) # @@ -302,6 +306,14 @@ def create_ontology(input_file: str, print("Created empty ontology:") newontology.print() + # + # add prefixes defined in json file... + # + for prefix, iri in context: + if not prefix in newontology.context: + s = iri.iri + ("#" if iri.hashtag else "") + newontology.context.add_context(prefix, s) + # # First we create the empty resource classes # diff --git a/knora/dsplib/utils/xml_upload.py b/knora/dsplib/utils/xml_upload.py index 0937bdfb4..3f768622e 100644 --- a/knora/dsplib/utils/xml_upload.py +++ b/knora/dsplib/utils/xml_upload.py @@ -86,8 +86,7 @@ class KnoraValue: is_richtext: bool def __init__(self, - context: etree.iterparse, - node: Tuple, + node: etree.Element, valtype: str, listname: Optional[str] = None) -> None: @@ -111,24 +110,6 @@ def __init__(self, self._value = listname + ':' + "".join(node.itertext()) else: self._value = "".join(node.itertext()) - richtext_stack: List[str] = [] - while True: - event, subnode = next(context) - if event == 'start': - if node.tag == 'text' and subnode.tag in richtext_tags: - richtext_stack.append(subnode.tag) - continue - raise XmlError( - 'Unexpected start tag: "{}" value-tags may contain no other tags!'.format(subnode.tag)) - else: - if richtext_stack and subnode.tag == richtext_stack[-1]: - richtext_stack.pop() - continue - if subnode.tag == valtype: - break - else: - pprint(richtext_stack) - raise XmlError('Unexpected end tag: "{}", but expected!'.format(subnode.tag, valtype)) @property def value(self): @@ -165,7 +146,7 @@ class KnoraProperty: _valtype: str _values: List[KnoraValue] - def __init__(self, context: etree.iterparse, node: Tuple, valtype: str, default_ontology: Optional[str] = None): + def __init__(self, node: etree.Element, valtype: str, default_ontology: Optional[str] = None): tmp = node.attrib['name'].split(':') if len(tmp) > 1: if tmp[0]: @@ -178,25 +159,11 @@ def __init__(self, context: etree.iterparse, node: Tuple, valtype: str, default_ self._valtype = valtype self._values = [] - while True: - event, subnode = next(context) - if event == 'start': - if subnode.tag == valtype: # the subnode must correspond to the expected value type - self._values.append(KnoraValue(context, subnode, valtype, listname)) - else: - raise XmlError('Unexpected start tag: "{}" may contain only tags!'.format(subnode.tag)) + for subnode in node: + if subnode.tag == valtype: # the subnode must correspond to the expected value type + self._values.append(KnoraValue(subnode, valtype, listname)) else: - if subnode.tag == 'text-prop' or subnode.tag == 'color-prop' or \ - subnode.tag == 'date-prop' or subnode.tag == 'decimal-prop' or \ - subnode.tag == 'geometry-prop' or subnode.tag == 'geoname-prop' or \ - subnode.tag == 'list-prop' or subnode.tag == 'iconclass-prop' or \ - subnode.tag == 'integer-prop' or subnode.tag == 'interval-prop' or \ - subnode.tag == 'period-prop' or subnode.tag == 'resptr-prop' or \ - subnode.tag == 'resptr-prop' or subnode.tag == 'time-prop' or \ - subnode.tag == 'uri-prop' or subnode.tag == 'boolean-prop': - break - else: - raise XmlError('Unknown endtag for property: "{}"!'.format(subnode.tag)) + raise XmlError('Unexpected tag: "{}" may contain only tags!'.format(subnode.tag)) @property def name(self): @@ -221,10 +188,10 @@ class KnoraResource: _label: str _restype: str _permissions: str - _image: str + _bitstream: str _properties: List[KnoraProperty] - def __init__(self, context: etree.iterparse, node: Tuple, default_ontology: Optional[str] = None) -> None: + def __init__(self, node: etree.Element, default_ontology: Optional[str] = None) -> None: """ Constructor that parses a resource node from the XML DOM @@ -242,52 +209,16 @@ def __init__(self, context: etree.iterparse, node: Tuple, default_ontology: Opti else: self._restype = 'knora-admin:' + tmp[0] self._permissions = node.attrib['permissions'] - self._image = None + self._bitstream = None self._properties = [] - while True: - event, subnode = next(context) - if event == 'start': - if subnode.tag == 'image': - self._image = node.text - elif subnode.tag == 'text-prop': - self._properties.append(KnoraProperty(context, subnode, 'text', default_ontology)) - elif subnode.tag == 'color-prop': - self._properties.append(KnoraProperty(context, subnode, 'color', default_ontology)) - elif subnode.tag == 'date-prop': - self._properties.append(KnoraProperty(context, subnode, 'date', default_ontology)) - elif subnode.tag == 'decimal-prop': - self._properties.append(KnoraProperty(context, subnode, 'decimal', default_ontology)) - elif subnode.tag == 'geometry-prop': - self._properties.append(KnoraProperty(context, subnode, 'geometry', default_ontology)) - elif subnode.tag == 'geoname-prop': - self._properties.append(KnoraProperty(context, subnode, 'geoname', default_ontology)) - elif subnode.tag == 'list-prop': - self._properties.append(KnoraProperty(context, subnode, 'list', default_ontology)) - elif subnode.tag == 'iconclass-prop': - self._properties.append(KnoraProperty(context, subnode, 'iconclass', default_ontology)) - elif subnode.tag == 'integer-prop': - self._properties.append(KnoraProperty(context, subnode, 'integer', default_ontology)) - elif subnode.tag == 'interval-prop': - self._properties.append(KnoraProperty(context, subnode, 'interval', default_ontology)) - elif subnode.tag == 'period-prop': - self._properties.append(KnoraProperty(context, subnode, 'period', default_ontology)) - elif subnode.tag == 'resptr-prop': - self._properties.append(KnoraProperty(context, subnode, 'resptr', default_ontology)) - elif subnode.tag == 'time-prop': - self._properties.append(KnoraProperty(context, subnode, 'time', default_ontology)) - elif subnode.tag == 'uri-prop': - self._properties.append(KnoraProperty(context, subnode, 'uri', default_ontology)) - elif subnode.tag == 'boolean-prop': - self._properties.append(KnoraProperty(context, subnode, 'boolean', default_ontology)) - else: - raise XmlError('Unexpected start tag: "{}" may contain only or tags!'.format(subnode.tag)) + for subnode in node: + if subnode.tag == 'bitstream': + self._bitstream = subnode.text + elif subnode.tag is etree.Comment: + continue else: - if subnode.tag == 'resource': - break - elif subnode.tag == 'image': - self._image = "".join(subnode.itertext()) - else: - raise XmlError('Unexpected end tag: "{}" expected!'.format(subnode.tag)) + ptype, dummy = subnode.tag.split('-') + self._properties.append(KnoraProperty(subnode, ptype, default_ontology)) @property def id(self) -> str: @@ -302,17 +233,17 @@ def restype(self) -> str: return self._restype @property - def image(self) -> str: - return self._image + def bitstream(self) -> str: + return self._bitstream @property def permissions(self): return self._permissions def print(self): - print('Resource: id={} restype: {} label: {}'.format(self._id, self._restype, self._label)) - if self._image is not None: - print(' Image: ' + self._image) + print(f'Resource: id={self._id} restype: {self._restype} label: {self._label}') + if self._bitstream is not None: + print(' Bitstream: ' + self._bitstream) for property in self._properties: property.print() @@ -384,7 +315,7 @@ class XmlAllow: _group: str _permission: str - def __init__(self, context: etree.iterparse, node: Tuple, project_context: ProjectContext) -> None: + def __init__(self, node: etree.Element, project_context: ProjectContext) -> None: """ Constructor which parses the XML DOM allow element @@ -410,7 +341,7 @@ def __init__(self, context: etree.iterparse, node: Tuple, project_context: Proje self._group = 'knora-admin:' + node.attrib['group'] else: raise XmlError("Group \"{}\" is not known: ".format(node.attrib['group'])) - self._permission = "".join(node.itertext()) + self._permission = node.text @property def group(self): @@ -420,6 +351,9 @@ def group(self): def permission(self): return self._permission + def print(self): + print(" group=", self._group, " permission=", self._permission) + class XmlPermission: """ @@ -428,7 +362,7 @@ class XmlPermission: _id: str _allows: List[XmlAllow] - def __init__(self, context: etree.iterparse, node: Tuple, project_context: ProjectContext) -> None: + def __init__(self, node: etree.Element, project_context: ProjectContext) -> None: """ Constructor which parses a XML DOM permissions element representing an named permission set @@ -437,22 +371,8 @@ def __init__(self, context: etree.iterparse, node: Tuple, project_context: Proje """ self._allows = [] self._id = node.attrib['id'] - while True: - event, subnode = next(context) - if event == 'start': - if subnode.tag == 'allow': - self._allows.append(XmlAllow(context, subnode, project_context)) - else: - raise XmlError('Unexpected tag: "{}" expected!'.format(subnode.tag)) - else: - if subnode.tag == 'allow': - pass - elif subnode.tag == 'resource': - break - elif subnode.tag == 'permissions': - break - else: - raise XmlError('Unexpected end tag: "{}"
expected!'.format(subnode.tag)) + for allow_node in node: + self._allows.append(XmlAllow(allow_node, project_context)) @property def id(self) -> str: @@ -474,6 +394,11 @@ def __str__(self): allowstrs.append("{} {}".format(allow.permission, allow.group)) return '|'.join(allowstrs) + def print(self): + print('Permission: ', self._id) + for a in self._allows: + a.print() + def do_sortorder(resources: List[KnoraResource]) -> List[KnoraResource]: """ @@ -535,7 +460,8 @@ def xml_upload(input_file: str, password: str, imgdir: str, sipi: str, - verbose: bool) -> bool: + verbose: bool, + validate: bool) -> bool: current_dir = os.path.dirname(os.path.realpath(__file__)) xmlschema_doc = etree.parse(os.path.join(current_dir, 'knora-data-schema.xsd')) @@ -547,6 +473,9 @@ def xml_upload(input_file: str, del doc del xmlschema_doc + if validate: + return + print("The input data file is syntactically correct and passed validation!") # @@ -557,29 +486,24 @@ def xml_upload(input_file: str, proj_context = ProjectContext(con=con) - # - # read the XML file containing the data, including project shortcode - # - context: etree.iterparse = etree.iterparse(input_file, events=("start", "end")) resources: List[KnoraResource] = [] permissions: Dict[str, XmlPermission] = {} shortcode: Union[str, None] = None default_ontology = None - while True: - event, node = next(context) - if event == 'start': - if node.tag == 'knora': - default_ontology = node.attrib['default-ontology'] - shortcode = node.attrib['shortcode'] - proj_context.shortcode = shortcode - elif event == 'start' and node.tag == 'resource': - resources.append(KnoraResource(context, node, default_ontology)) - elif event == 'start' and node.tag == 'permissions': - permission = XmlPermission(context, node, proj_context) - permissions[permission.id] = permission - elif event == 'end': - if node.tag == 'knora': - break + + # + # read the XML file containing the data, including project shortcode + # + tree = etree.parse(input_file) + knora = tree.getroot() + default_ontology = knora.attrib['default-ontology'] + shortcode = knora.attrib['shortcode'] + for child in knora: + if child.tag == "permissions": + permission = XmlPermission(child, proj_context) + permissions[permission.id] = permission + elif child.tag == "resource": + resources.append(KnoraResource(child, default_ontology)) # # sort the resources so that resources which do not link to others come first @@ -601,15 +525,16 @@ def xml_upload(input_file: str, resiri_lookup: StrDict = {} for resource in resources: - if resource.image: - img = sipi.upload_image(os.path.join(imgdir, resource.image)) - stillimage = img['uploadedFiles'][0]['internalFilename'] + #resource.print() + if resource.bitstream: + img = sipi.upload_bitstream(os.path.join(imgdir, resource.bitstream)) + bitstream = img['uploadedFiles'][0]['internalFilename'] else: - stillimage = None + bitstream = None instance = resclasses[resource.restype](con=con, label=resource.label, permissions=permissions_lookup.get(resource.permissions), - stillimage=stillimage, + bitstream=bitstream, values=resource.get_propvals(resiri_lookup, permissions_lookup)).create() resiri_lookup[resource.id] = instance.iri print("Created:", instance.iri) diff --git a/knora/icons/knora-py-logo.png b/knora/icons/knora-py-logo.png deleted file mode 100644 index ab48254fd..000000000 Binary files a/knora/icons/knora-py-logo.png and /dev/null differ diff --git a/knora/test-data.xml b/knora/test-data.xml index f750332b8..e5dd55355 100644 --- a/knora/test-data.xml +++ b/knora/test-data.xml @@ -1,82 +1,199 @@ + shortcode="4123" default-ontology="testonto"> RV V CR CR - D + D V CR> CR> - M> + M> V V CR CR> - D> + D> V CR CR - M + M - + + Dies ist anderes TestThing + + + + - + Dies ist ein einfacher Text ohne Markup Nochmals einen einfachen Text - - This is bold and string text! + + This is bold and string text! - - #00ff00 - - + + + true + + JULIAN:CE:1401-05-17:CE:1402-01 - + + 4711 + + 2.718281828459 - + + + { + "status":"active", + "lineColor":"#ff3333", + "lineWidth":2, + "points":[ + {"x":0.08098591549295775,"y":0.16741071428571427}, + {"x":0.7394366197183099,"y":0.7299107142857143}], + "type":"rectangle", + "original_index":0 + } + + + 5416656 - - opt4 - - - 4711 - - + 12.5:14.2 - - true - + + #00ff00 + + + b2 + + + obj_0000 + - - test.tif - - Blätter + TEMP11.TIF + + This is a Imagething - - Ein Testbild im TIFF format + + + + + This is a Compoundthong - + + + + TEMP12.TIF + + obj_0003 + + + 1 + + + + + TEMP13.TIF + + obj_0003 + + + 2 + + + + + + TEMP14.TIF + obj_0003 + + 3 + + + + + test.pdf + + This is a Documentthing + + + + + test.csv + + This is a Textthing as CSV + + + + + test.zip + + This is a Zipthing + + + + clara.wav + + This is a Audiothing + + + diff --git a/knora/test-onto.json b/knora/test-onto.json new file mode 100644 index 000000000..2bcbc9ad9 --- /dev/null +++ b/knora/test-onto.json @@ -0,0 +1,482 @@ +{ + "prefixes": { + "foaf": "http://xmlns.com/foaf/0.1/", + "dcterms": "http://purl.org/dc/terms/" + }, + "project": { + "shortcode": "4123", + "shortname": "tp", + "longname": "test project", + "descriptions": { + "en": "A systematic test project", + "de": "Ein systematisches Testprojekt" + }, + "keywords": [ + "test", + "testing" + ], + "lists": [ + { + "name": "testlist", + "labels": { + "en": "Testlist" + }, + "nodes": [ + { + "name": "a", + "labels": { + "en": "a_label" + } + }, + { + "name": "b", + "labels": { + "en": "b_label" + }, + "nodes": [ + { + "name": "b1", + "labels": { + "en": "b1_label" + } + }, + { + "name": "b2", + "labels": { + "en": "b2_label" + } + } + ] + }, + { + "name": "c", + "labels": { + "en": "c_label" + } + } + ] + } + ], + "groups": [ + { + "name": "testgroup", + "description": "Test group", + "selfjoin": false, + "status": true + } + ], + "users": [ + { + "username": "tester", + "email": "tester@test.org", + "givenName": "Testing", + "familyName": "tester", + "password": "test0815", + "lang": "en", + "groups": [ + ":testgroup" + ], + "projects": [ + ":admin", + "anything:member" + ] + } + ], + "ontologies": [ + { + "name": "testonto", + "label": "Test ontology", + "properties": [ + { + "name": "hasText", + "super": [ + "hasValue" + ], + "object": "TextValue", + "labels": {"en": "Text"}, + "gui_element": "SimpleText", + "gui_attributes": { + "maxlength": "255", + "size": 80 + } + }, + { + "name": "hasRichtext", + "super": [ + "hasValue" + ], + "object": "TextValue", + "labels": {"en": "Text"}, + "gui_element": "Richtext" + }, + { + "name": "hasUri", + "super": [ + "hasValue" + ], + "object": "UriValue", + "labels": {"en": "URI"}, + "gui_element": "SimpleText", + "gui_attributes": { + "maxlength": "255", + "size": 80 + } + }, + { + "name": "hasBoolean", + "super": [ + "hasValue" + ], + "object": "BooleanValue", + "labels": {"en": "Boolean value"}, + "gui_element": "Checkbox" + }, + { + "name": "hasDate", + "super": [ + "hasValue" + ], + "object": "DateValue", + "labels": {"en": "Date"}, + "gui_element": "Date" + }, + { + "name": "hasInteger", + "super": [ + "hasValue" + ], + "object": "IntValue", + "labels": {"en": "Integer"}, + "gui_element": "Spinbox", + "gui_attributes": { + "max": -1.0, + "min": 0.0 + } + }, + { + "name": "hasDecimal", + "super": [ + "hasValue" + ], + "object": "DecimalValue", + "labels": {"en": "Decimal number"}, + "gui_element": "SimpleText", + "gui_attributes": { + "maxlength": "255", + "size": 80 + } + }, + { + "name": "hasGeometry", + "super": [ + "hasValue" + ], + "object": "GeomValue", + "labels": { "en": "Geometry" }, + "gui_element": "Geometry" + }, + { + "name": "hasGeoname", + "super": [ + "hasValue" + ], + "object": "GeonameValue", + "labels": {"en": "Geoname"}, + "gui_element": "Geonames" + }, + { + "name": "hasInterval", + "super": [ + "hasValue" + ], + "object": "IntervalValue", + "labels": {"en": "Time interval"}, + "gui_element": "Interval" + }, + { + "name": "hasColor", + "super": [ + "hasValue" + ], + "object": "ColorValue", + "labels": {"en": "Color"}, + "gui_element": "Colorpicker" + }, + { + "name": "hasListItem", + "super": [ + "hasValue" + ], + "object": "ListValue", + "labels": {"en": "List element"}, + "gui_element": "List", + "gui_attributes": { + "hlist": "testlist" + } + }, + { + "name": "hasTestRegion", + "super": [ + "hasLinkTo" + ], + "object": "Region", + "labels": {"en": "has region"}, + "gui_element": "Searchbox" + }, + { + "name": "hasTestThing2", + "super": [ + "hasLinkTo" + ], + "object": ":TestThing2", + "labels": {"en": "Another thing"}, + "gui_element": "Searchbox" + } + ], + "resources": [ + { + "name": "TestThing", + "super": "Resource", + "labels": { + "en": "TestThing" + }, + "comments": { + "en": "A thing to test things", + "de": "Ein Ding um allerlei Dinge zu testen." + }, + "cardinalities": [ + { + "propname": ":hasText", + "gui_order": 1, + "cardinality": "1-n" + }, + { + "propname": ":hasRichtext", + "gui_order": 2, + "cardinality": "0-n" + }, + { + "propname": ":hasUri", + "gui_order": 3, + "cardinality": "0-n" + }, + { + "propname": ":hasBoolean", + "gui_order": 4, + "cardinality": "1" + }, + { + "propname": ":hasDate", + "gui_order": 5, + "cardinality": "0-n" + }, + { + "propname": ":hasInteger", + "gui_order": 6, + "cardinality": "0-n" + }, + { + "propname": ":hasDecimal", + "gui_order": 7, + "cardinality": "0-n" + }, + { + "propname": ":hasGeometry", + "gui_order": 8, + "cardinality": "0-n" + }, + { + "propname": ":hasGeoname", + "gui_order": 9, + "cardinality": "0-n" + }, + { + "propname": ":hasInterval", + "gui_order": 10, + "cardinality": "0-n" + }, + { + "propname": ":hasColor", + "gui_order": 11, + "cardinality": "0-n" + }, + { + "propname": ":hasListItem", + "gui_order": 12, + "cardinality": "0-n" + }, + { + "propname": ":hasTestRegion", + "gui_order": 13, + "cardinality": "0-n" + }, + { + "propname": ":hasTestThing2", + "gui_order": 14, + "cardinality": "0-n" + } + ] + }, + { + "name": "TestThing2", + "super": "Resource", + "labels": { + "en": "Another Test Thing" + }, + "comments": { + "en": "Another thing for testing things." + }, + "cardinalities": [ + { + "propname": ":hasText", + "gui_order": 1, + "cardinality": "1" + } + ] + }, + { + "name": "CompoundThing", + "super": "Resource", + "labels": { + "en": "A Compound Thing" + }, + "comments": { + "en": "A thing for testing compound things." + }, + "cardinalities": [ + { + "propname": ":hasText", + "gui_order": 1, + "cardinality": "1" + } + ] + }, + { + "name": "ImageThing", + "super": "StillImageRepresentation", + "labels": { + "en": "An Image Thing" + }, + "comments": { + "en": "An image thing for testing image things." + }, + "cardinalities": [ + { + "propname": ":hasText", + "gui_order": 1, + "cardinality": "1" + } + ] + }, + { + "name": "AudioThing", + "super": "AudioRepresentation", + "labels": { + "en": "An Audio Thing" + }, + "comments": { + "en": "An audio thing for testing audio things." + }, + "cardinalities": [ + { + "propname": ":hasText", + "gui_order": 1, + "cardinality": "1" + } + ] + }, + { + "name": "MovieThing", + "super": "MovingImageRepresentation", + "labels": { + "en": "An Movie Thing" + }, + "comments": { + "en": "An movie thing for testing moving image things." + }, + "cardinalities": [ + { + "propname": ":hasText", + "gui_order": 1, + "cardinality": "1" + } + ] + }, + { + "name": "DocumentThing", + "super": "DocumentRepresentation", + "labels": { + "en": "A Document Thing" + }, + "comments": { + "en": "A second things for testing different things." + }, + "cardinalities": [ + { + "propname": ":hasText", + "gui_order": 1, + "cardinality": "1" + } + ] + }, + { + "name": "ZipThing", + "super": "DocumentRepresentation", + "labels": { + "en": "A ZIP Thing" + }, + "comments": { + "en": "A things for testing ZIPS." + }, + "cardinalities": [ + { + "propname": ":hasText", + "gui_order": 1, + "cardinality": "1" + } + ] + }, + { + "name": "TextThing", + "super": "TextRepresentation", + "labels": { + "en": "A Text Thing" + }, + "comments": { + "en": "A things for testing TEXTS." + }, + "cardinalities": [ + { + "propname": ":hasText", + "gui_order": 1, + "cardinality": "1" + } + ] + }, + { + "name": "PartOfThing", + "super": "StillImageRepresentation", + "labels": { + "en": "A Thing having a partOf and seqnum property" + }, + "comments": { + "en": "A thing for testing partOf and seqnum properties." + }, + "cardinalities": [ + { + "propname": "isPartOf", + "gui_order": 1, + "cardinality": "1" + }, + { + "propname": "seqnum", + "gui_order": 2, + "cardinality": "1" + } + ] + } + ] + } + ] + } +} diff --git a/setup.py b/setup.py index f64e1c891..b26f37722 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name='dsp-tools', - version='0.9.4', + version='0.9.15', description='A Python library and tools for the DaSCH Service Platform', long_description=long_description, long_description_content_type="text/markdown", @@ -13,10 +13,7 @@ author='Lukas Rosenthaler', author_email='lukas.rosenthaler@dasch.swiss', license='GPLv3', - packages=setuptools.find_packages('./knora'), - package_dir={ - '': 'knora' - }, + packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", @@ -24,6 +21,7 @@ ], python_requires='>=3.9.0', install_requires=[ + 'argparse', 'rdflib', 'lxml', 'validators',