Index by title

Achievements

To bring some fun into the application for user who enter data we are thinking about adding game like achievements.
Also it could be useful to motivate users to explore the application, give feedback and similar.
Here are some ideas, feel free to add your own.

Implementation

Rewards

Achievements

Generic

Competitive

External achievements

Interesting but has to be updated manually for users in every version of OpenAtlas they are part of.


Anthropological Analyses

Tools for anthropological analyses to use directly while working in human remains. Allowing the acquisition of basic data like age, sex, and pathologies to use in an anthropological and archaeological context.
Regarding the model this is connected to burial as a stratigraphic unit (E18 physical object) and human remains (E20 biological object).
For some aspects entering data is already possible but a better user interface is desirable. For other data new ways of entering are required e.g. for sex and age estimation.

Issue #1352

To do

Bone Inventory

For the (graphical) anthropological interface the following bones and bone parts have to be recorded (import ID of bones already entered as types in brackets):
See: Bone inventory

Sex estimation

Model

This information will be mapped within CIDOC CRM model. E18 (physical thing)-> P2 (has type) -> E55 (Type)

To do

Calculation of sex estimation:

(Bone feature x costum type (female/female?/indifferent/male?/male) x weighting)/sum of weighting entered = sex estimation

Options Features
Skull Mandible Pelvis Robusticity

Result:
Sex estimation: -2 to -0,7 = female, -0,69 to -0,31 = possibly female, -0,3 to 0,3 = indifferent, 0,31 to 0,69 = possibly male, 0,7 to 2 = male

Layout

At "stratigraphic unit" a new tab called "Tools", where links to eg. sex estimation, age estimation, pathologies, and also (if available) a few results, as well as skeleton graphic, are shown.
Clicking on "sex estimation" links will bring you to a page showing an overview over detailed information on the respective bone features and a button to edit them.

Teeth

Age estimation

Grown-up

Child

Pathologies/Non metric traits

Vertebrae

Joints


The OpenAtlas API (Application programming interface) is implemented since version 5.0.0. Output is based on JSON-LD syntax and GeoJSON, therefore could be rendered in many web mapping applications.
In addition, Linked Places was used as standard. Further information can be found in the API Whitepaper.

Information about configuration: API Settings

Access

GeoJSON of an entity can be requested when entering this URL schema {domain}/api/{api version}/{entity_id} for example: openatlas.eu/api/0.1/entity/1234
Alternatively if advanced layout is selected in your profile a link to the GeoJSON of entities is shown on their info page.
If in the site settings the API option Public is activated (default is off) the API can be used even when not logged in.
The API is in active development, more formats and options will follow. The current version is 0.1, major changes may render former versions obsolete.

GeoJSON Structure

For the Version 0.1 OpenAtlas only supports GeoJSON. The structure for each entity is as followed. If a key:value pair is empty, it will not be shown in the output. For full examples of the GeoJSON templates please confer JSON Templates.

@context (required)

Contains the mappings for linked ontologies. We use the Linked Places mappings found in http://linkedpasts.org/assets/linkedplaces-context-v1.jsonld

e.g. "@context": "https://raw.githubusercontent.com/LinkedPasts/linked-places/master/linkedplaces-context-v1.jsonld"

type (required)

The type of each output is "FeatureCollection", according to GeoJSON-LD , containing one or more Feature objects.

feature[] (required)

Feature is a list, which can hold one or many feature objects. Each object can contain following elements:

@id (required)

This is a unique and permanent URI pointing to the entity in the OpenAtlas instance.

"@id": "http://thanados.openatlas.eu/entity/50505" 

crmClass (required)

Show CIDOC CRM class code and name based on the Erlangen CRM

"crmClass": "crm:E18_Physical_Thing" 

type (required)

The value for type is "feature" to state, that the object is a feature.

properties{} (required)

The property element holds one key:value pair, because of the GeoJSON requirement. The key is title, which is the preferred name label of the entity. In the OA form it is called Form field name.

         "properties":{
            "title":"Gars Thunau Obere Holzwiese" 
         }

when{}

When is the temporally scope of the represented feature. OpenAtlas only supports dates in the YYYY-MM-DD format, so no periods or extensions for approximate and uncertain (for more details: Date).
Each "when" contains one timespans[] . A timespan can contain start{} and/or end{}. start{} or end{} hold timestamp values and the comments for the dates.

         "when":{
            "timespans":[
               {
                  "end":{
                     "earliest":"0950-01-01",
                     "latest":"0950-12-31" 
                  },
                  "start":{
                     "earliest":"0750-01-01",
                     "latest":"0750-12-31" 
                  }
               }
            ]
         }

names[]

names is a list of Aliases.

         "names":[
            {
               "alias":"Thunau Obere Holzwiese" 
            }
         ]

types[]

Represents a list of one or more types objects (nodes) for this feature. Identifier refers to the type entity of the type and label is the given name of the type. Hierarchy lists the super types in a string for the THANATOS front end. If the type is a value type, the unit and value is also shown.

         "types":[
            {
               "hierarchy":"Evidence > Archaeology",
               "identifier":"http://thanados.openatlas.eu/api/0.1/entity/5099",
               "label":"Excavation" 
            },
            {
               "hierarchy":"Dimensions",
               "identifier":"http://thanados.openatlas.eu/api/0.1/entity/26189",
               "label":"Length",
               "unit":"cm",
               "value":"200" 
            }
         ]

geometry{} (required)

A GeoJSON FeatureCollection must have one or more geometry elements to be valid. Therefore each entity, even if it has no geometric references has this entry:

         "geometry":{
            "geometries":[ ],
            "type":"GeometryCollection" 
         }

Type refers to geometric types according to RFC 7946 - The GeoJSON Format.

Geometries[] is a list of none or more geometric objects. Each of these objects have the following keys:

links[]

These are the links to other gazetteers. At the moment OpenAtlas support GeoNames, as described in Place.

         "links":[
            {
               "identifier":"http://www.geonames.org/2763660",
               "type":"closeMatch" 
            }
         ]

relations[]

Is a list of one or more entities, which are linked through the CRM to this feature. Label represents the name of the entity, relationTo contains the direct link to this entity and relationType shows the property code from the model with which the entities are linked.

"relations":[
            {
               "label":"Cenotaph_A",
               "relationTo":"http://oa-dev.koschigel.de/api/0.1/entity/57167",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Excavation",
               "relationTo":"http://oa-dev.koschigel.de/api/0.1/entity/5099",
               "relationType":"crm:P2_has_type" 
            }
]

descriptions[]

Contains the description of the entity.

         "description":[
            {
               "value":"In the area of Obere Holzwiese 215 inhumation burials were documented in different excavations[..]" 
            }
         ]

depictions[]

Is a list of all linked depictions or files. @id links directly to the file, title represents the given name and license contains the given license of the file.

         "depictions":[
            {
               "@id":"http://oa-dev.koschigel.de/api/0.1/entity/117992",
               "license":"CC BY-SA 4.0",
               "title":"oberleiserberg_map" 
            }
         ]


Postponed

API Authentication

This page is a discussion base and documentation about the authentication system of the API.

Questions

Token-Based vs. CORS

To be filled.... (What is Token-Based and CORS, advantages and disadvantages, usage, flask compatibly?)

Discussion stuff

Resources


API Error Handling

For the API we want to create a more detailed error model. The error message should be machine- and human-readable, therefore we use json format as response language.

One example could be:

{
  instance: "http://127.0.0.1:5000/api/0.1/entity/157",
  title: "Forbidden",
  status: 403,
  detail: "You don't have the permission to access the requested resource. Please authenticate with the server, either through login via the user interface or token based authentication.",
  help: "https://redmine.craws.net/projects/uni/wiki/API_Authentication",
  timestamp: "Fri, 29 May 2020 10:13:22 GMT",
}

As a RFC draft for API error messages states (https://tools.ietf.org/html/draft-nottingham-http-problem-07):

Used Error Codes

Following error codes will be caught by the API error handler:

Code Description Detail Error Message
400 Bad Request Client sent an invalid request — such as lacking required request body or parameter The request is invalid. The body or parameters are wrong.
401 Unauthorized Client failed to authenticate with the server You failed to authenticate with the server.
403 Forbidden Client authenticated but does not have permission to access the requested resource You don't have the permission to access the requested resource. Please authenticate with the server, either through login via the user interface or token based authentication.
404 Not Found The requested resource does not exist Something went wrong! Maybe only digits are allowed. Please check the URL.
404a Not Found The requested resource does not exist The requested entity doesn't exist. Try another ID.
404b Not Found The requested resource does not exist The syntax is incorrect. Only digits are allowed. For further usage, please confer the help page.
404c Not Found The requested resource does not exist The syntax is incorrect. Valid codes are: actor, event, place, source, reference and object. For further usage, please confer the help page.
404d Not Found The requested resource does not exist The syntax is incorrect. These class code is not supported. For the classes please confer the model.
404e Not Found The requested resource does not exist The syntax is incorrect. Only integers between 1 and 100 are allowed.
404f Not Found The requested resource does not exist The syntax is incorrect. Only valid operators are allowed.
405 Invalid Method The method is not available The method used is not supported. Right now only GET is allowed.

Reference Links

To Do:


API meets Frontend 08.09.20 14:00

Participants: Bernhard Koschicek, Alexander Watzinger, Nina Brundke, Christoph Hoffmann, Stefan Eichert and special guest Smilla
Location: ACDH-CH, Alte Burse, Sonnenfelsgasse 19, 1010 Vienna
Time: 2020-08-09, 14:00

General

API presentation

API meets Frontend

Outcome:

Bernhard's Roadmap

  1. Develop custom queries, that are discussed today
  2. Include URLs to pagination (is not needed)
  3. Introduce new JSON schemas for other entities
  4. Optimize performance

Finishing

Conclusion

After we discussed the excellent presented and extensive recent development we decided to switch to a more practical approach. Christoph and Stefan will write issues for the API to satisfy their needs for presentation sites so that we can see and test the API in action.


This whitepaper is currently deprecated. Please refere to https://app.swaggerhub.com/apis/ctot-nondef/OpenAtlas/0.2-develop#/ for a better understanding of the OpenAtlas API

API Whitepaper

Issue: #1050

To make it easier for other application to use data from OpenAtlas directly we plan to implement an API (application programming interface).

There are already some use cases:

Purpose

Main purpose is the automatic data exchange between systems via URLs.

Since the API should be very stable (additions are ok but no interface changes for possible other systems already using it) we will take some time to plan it in detail.

Resources

Great Resources on API development:

Different Schema

Persons

Ideas

Meeting Questions:

Todo:

Development:

Archive

Documents archived for historical reasons.


Basic Entities (Types/Periods/Timespans/Places)

Hierarchies

Event E5

Linked with: P117 occurs during
Domain: E5, E6, E8, E12
Range: E5, E6, E8, E12

Actor E21

Linked with: P107 has current or former member
Domain: E74, E40
Range: E21, E74, E40

Types

Entries with * are obligatory and cannot be altered. Others are facultative examples and are editable/extendable

Types E55 are linked with E55 via P127 (has broader term)

Actor Function

Definitions of an actor's function within a group or legal body. An actor can for example be member of a legal body and this membership is defined by a certain function/role during a certain period of time. E.g. Actor "Charlemagne" is member of the legal body "Frankish Reign" from 768-814 in the function of "King" and he is member of the legal body "Roman Empire" from 800 to 814 in the function "Emperor".

Bishop
Abbot
Pope
King
Emperor
Count
Duke

References

Image

Text

Source

Types for Sources

Charter
Testament
Letter
Contract

Bibliography Item

Definitions for the type of bibliographic items like "articles", "books", "proceedings" etc.

Article
Book
Inbook
Mastersthesis
Phdthesis
unpublished

Edition

Definitions for the type of Source Editions like "Charter Edition" etc.

Charter Edition
Letter Edition
Chronicle Edition
...

Linguistic object classification*

Source Content*
Source Original Text*
Source Translation*
Comment*

Information Carrier

Categories for the types of information carriers. E.g. to determine if the physical manifestation of a medieval charter is an original, a later copy etc.

Original Document
Copy of Document

Actor Actor Relation

_Definitions of relationships between one actor and another. These relationships can be directional (e.g. parent of/child of: actor A is the father of actor B while actor B is the son of actor A) or be the same in both directions (e.g. friend of: actor A is friend of actor B and vice versa actor B is friend of actor A) _

Kindredship
   Parent of (Child of)
Social
   Friend of
   Enemy of
   Mentor of (Student of)
Political
   Ally of
   Leader of (Retinue of)
Economical
   Provider of (Customer of)

Date value type

Exact date value
From date value
To date value

Localisation Quality

Exact position
Near to a known position
Within a known area

Gender

Categories for persons' gender

Female
Male

Place

Types for Places sites-example

Boundary Mark
Burial Site
Economic Site
Infrastructure
Military Facility
Ritual Site
Settlement
Topographical Entity

Event Types

Types of events

Change of Property
  Donation
  Sale
  Exchange
Conflict
  Battle
  Raid

Involvement

Categories to define the involvement of an actor within an event. E.g. "Napoleon" participated in the event "Invasion of Russia" as "Commander"

Creator
Sponsor
Victim
Offender

Places (World)

E53 linked via P89 "falls within/contains" to E53 - e.g. Austria contains Wien/Wien falls within Austria


Administrative Units
   Austria
      Wien
      Kärnten
      Niederösterreich
      Oberösterreich
      Salzburg
      Tirol
      Steiermark
      Vorarlberg
      Burgenland
   Germany
   Italy
   Czech Republic
   Slovakia
   Slovenia

Types for Places

E55 entities (but listed here as they belong to places)
used to determine the type of place e.g. country, province, district... Uses national terms due to each country's different systems

Country
Bundesland
Bezirk
Gemeinde
Katastralgemeinde
Regierungsbezirk
Landkreis
Gemarkung
Regioni
Comune
Province

Historical Place

E53 entities. These Places are for example historical regions like the "Medieval Kingdom of Serbia" or the early medieval "Duchy of Bavaria".

Historical Places
   Carantania
   Marcha Orientalis
   Comitatus Iauntal
  Kingdom of Serbia

Bone inventory

Numbers in brackets are type ids from the THANADOS project.


In the following section some mapping examples are discussed. Please be aware of the fact, that they may vary from the current development version of OpenAtlas.

Data Model

Mappings

In this section various data-mappings, as used in OpenAtlas, are presented. They use Classes and Properites from the CIDOC CRM (http://www.cidoc-crm.org/) to map the information. If custom properties or shortcuts are used they are named "OA" with a certain number. They are described in detail in the Custom Properties and Shortcuts section. Within OpenAtlas it is also possible to specify various additional attributes a property can have. E.g. the timespan in which this property links two entities or for example the role an actor has within a certain group.

Names

Every entity recorded in OpenAtlas can have a main name respectively a primary identifier, that is stored via P1 ("is identified by" or sub-property) from the entity to E41 ("Appelation" or sub-class). This name or identifier can consist of one ore more words and can contain - e.g. in case of an actor - a first name, second name and surname as well as additional informations like titles: "Sir Elton Hercules John".
If an entity has alternative names like stagenames or pseudonyms they are also documented using a P1 (is identified by) linked to E41 (Appelation): "Reginald Kenneth Dwight" (=Birthname of Elton John). Another example would be "Charlemagne", "Carolus Magnus" and "Karl der Große" that are recorded with the described properties.

Alternative forms of names are mapped with P139: Two E42 identifier entities linked via P139 (has alternative form).

Documents

Written Sources (History)

Written sources like for example medieval charters are mapped in OpenAtlas as a combination of several entities. The core is the content of the source that is defined as E33 (linguistic object).

This core usually contains a summary or the whole text of the source in a language understandable for the current users of the database. This core can be linked to translations respectively to the text in the original language (e.g. Latin) that is also stored as E33 (linguistic object).
The core can also be linked to a physical object (E84 Information Carrier) like the original charter (e.g. a parchment manuscript) that carries the information described in the core.
The core content of course can also be documented in other documents (E31) like for example various editions of charters or also secondary source.

This core of the source, respectively the source's content delivers information on various other things like the events, persons and physical things mentioned in the text. These relations are recorded with a P70b (is documented in) link from the mentioned entity to the source.

Information on the environment in which the source originally was generated or on the current or former owner is connected to the physical object/information carrier. This includes for example the legal body or the actor for whom a charter originally was signed or the archive where it is or was stored. Also time and place of creation, as well as the creator and the context of the creation can be stored.

The actor for whom the document was originally set up is recorded by a link P105 (right held by) from the information carrier (E84) to the actor.
The current or former owner of the document, e.g. the archive where a charter is currently kept, is recorded by a link P46 (has former or current owner) from the information carrier (E84) to the actor,

The production of the charter is recorded by an E12 (Production) event that is linked to the charter (E84 information carrier) with a P108 (was produced by) link.
This E12 Prodcution can be linked to places (P7 took place at) and to a certain point in time (OA5 and OA6 begins/ends at).

It can also be linked to other temporal entities, like a superior event during which the charter was produced (e.g. a Hoftag/Assembly) or to a certain chronological period/timespan via a P117 (occurs during) link.

The creator/writer (E39 Actor) of the charter is linked to the production event via a P104 (performs) property.

Actors

Within OpenAtlas single Persons (E21), Groups (E74) – like families – and legal bodies (E40) like for example the Holy Roman Empire are dealt with.
They can be linked to other entites like actors, events, documents, physical things, places, date and time etc.

Actors and Events

Actors can participate in Events either actively or passively. The first case is mapped with P14 performed, the latter with P11 participated in. In case of changes of property (i.e. if the event is a E8 Acquisition) P23 surrendered title through - for the giver - and P22 acquired title through -for the receiver - are used.

Also the actor's role can be documented by linking the property with a E55 type entity: For example to map an actor's role as sponsor and another one's role as artist/creator during the creation of a physical man made thing.

Actors and Sources

Actors (like any other entities) can be linked to E73 Information Objects like E31 Document e.g. an article on a historical person or E33 linguistic objects like the text of a medieval charter in which a person is mentionend.

Actors and Groups/Legal Bodies

Actors can be part of or have a certain role within a E74 group or a E40 legal body. The specification of this "membership" is recorded with a link to a E55 type

Actors and Actors

Actors can have direct relationships to other actors. Such relations are mapped with OA7 has relationship to. The type of relationship is specified with a link to E55 type.
Such relationships can be the same in both directions (E.g. Person A is friend of Person B and at the same time Person B is friend of Person A) or have an opposite meaning in the opposite direction (E.g. Person A is the father of person B while Person B is the son of Person A).

Actors and Physical Things

Actors can have direct relationships to Physical Things. In most cases this regards property which means that for example a person is the owner of a thing, like e.g. a manor. Such relations are mapped with P51i is former of current owner of.

Actors and Places

Actors can have various direct relations to places. Next to them they may participate at an event that takes place a a certain location (see: Actors and Events

Residence/Main Place/Headquartier of an actor

Actors can have a certain prefered place like a residence, a headquarter etc. E.g. Salzburg (E53 place) is the headquarter of the Salzburg Bishopric (E40 legal body) Such relations are mapped with P74 has current or former residence.

Birthplace/Place of Death of an actor

Actors can have a certain place in which they are born (or appear for the firs time) as well as a place of death (or a place where they appear for the last time). Such relations are mapped with OA8 appears for the first time in and OA9 appears for the last time in.

Actors and Chronological Information

Date/Timestamp of birth/death (numeric)

Actors can have a date at which they were born (or appear for the first time) or die (respectively appear for the last time). Such relations are mapped with OA1 begins chronologically and OA2 ends chronologically (to mark the timespan or date in/on which they appear for the first time) or OA3 born_chronologically and OA4 dies_chronologically (to mark a date on which they where born or died - if known). They link an actor with a time primitive like a timestamp.

In case this date is not known exactly, two time primitives can be recorded to mark a certain temporal span in which the birth or the first resp. death or last appearance took place. The first timestamp therefore is connected (p2 has type) with a type (E52) "from value", the second with a "to value" type (=Subtypes of "Numeric Value Types"). If one exact date is known this one gets the type "exact value".

Custom Properties and Shortcuts

These shortcuts are used in OpenAtlas to link various entities for certain purposes:

OA1 "begins chronologically"

OA1 is used to link the beginning of a persistent item's (E77) life span (or time of usage) with a certain date in time.

E77 Persistent Item linked with a E61 Time Primitive:
E77 (Persistent Item) - P92i (was brought into existence by) - E63 (Beginning of Existence) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [Holy Lance (E22)] was brought into existence by [forging of Holy Lance (E12)] has time span [Moment/Duration of Forging of Holy Lance (E52)] ongoing througout [0770-12-24 (E61)]

OA2 "ends chronologically"

OA2 is used to link the end of a persistent item's (E77) life span (or time of usage) with a certain date in time.

E77 Persistent Item linked with a E61 Time Primitive:
E77 (Persistent Item) - P93i (was taken out of existence by) - E64 (End of Existence) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [The one ring (E22)] was destroyed by [Destruction of the one ring (E12)] has time span [Moment of throwing it down the lava (E52)] ongoing througout [3019-03-25 (E61)]

OA3 "born chronologically"

OA3 is used to link the birth of a person with a certain date in time.

E21 Person's Birth linked with a E61 Time Primitive:
E21 (Person) - P98i (was born) by - E67 (Birth) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [Stefan (E21)] was born by [birth of Stefan (E12)] has time span [Moment/Duration of Stefan's birth (E52)] ongoing througout [1981-11-23 (E61)]

OA4 "died chronologically"

OA4 is used to link the death of a person with a certain date in time.

E21 Person's Death linked with a E61 Time Primitive:
E21 (Person) - P100i (died in) - E69 (Death) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [Lady Diana (E21)] died in [death of Diana (E69)] has time span [Moment/Duration of Diana's death (E52)] ongoing througout [1997-08-31 (E61)]

OA5 "begins chronologically"

OA5 is used to link the beginning of a temporal entity (E2) with a certain date in time. It can also be used to determine the beginning of a property's duration.

E2 Temporal Entity linked with a E61 Time Primitive:
E2 (Temporal Entity) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [ Thirty Years' War (E7)] has time span [Moment/Duration of Beginning of Thirty Years' War (E52)] ongoing througout [1618-05-23 (E61)]

OA6 "ends chronologically"

OA6 is used to link the end of a temporal entity's (E2) with a certain date in time. It can also be used to determine the end of a property's duration.

E2 temporal entity linked with a E61 Time Primitive:
E2 (temporal entity) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [ Thirty Years' War (E7)] has time span [Moment/Duration of End of Thirty Years' War (E52)] ongoing througout [1648-10-24 (E61)]

OA7 "has relationship to"

OA7 is used to link two Actors (E39) via a certain relationship

E39 Actor linked with E39 Actor
E39 (Actor) - P11i (participated in) - E5 (Event) - P11 (had participant) - E39 (Actor)

Example: [ Stefan (E21)] participated in [ Relationship from Stefan to Joachim (E5)] had participant [Joachim (E21)]

The connecting event is defined by an entity of class E55 (Type):
[Relationship from Stefan to Joachim (E5)] has type [Son to Father (E55)]

OA8 "appears for the first time in"

OA8 is used to link the beginning of a persistent item's (E77) life span (or time of usage) with a certain place. E.g to document the birthplace of a person.

E77 Persistent Item linked with a E53 Place:
E77 (Persistent Item) - P92i (was brought into existence by) - E63 (Beginning of Existence) - P7 (took place at) - E53 (Place)

Example: [Albert Einstein (E21)] was brought into existence by [Birth of Albert Einstein (E12)] took place at [Ulm (E53)]

OA9 "appears for the last time in"

OA9 is used to link the end of a persistent item's (E77) life span (or time of usage) with a certain place. E.g to document a person's place of death.

E77 Persistent Item linked with a E53 Place:
E77 (Persistent Item) - P93i (was taken out of existence by) - E64 (End of Existence) - P7 (took place at) - E53 (Place)

Example: [Albert Einstein (E21)] was taken out of by [Death of Albert Einstein (E12)] took place at [Princeton (E53)]

OA10 "belongs stylistically to"

OA10 is used to link a persistent item (E77) to a certain stylistic period.
E77 (Persistent Item) - P8 (witnessed) - E5 (its own Creation or Modification) - P117 (occurs during) - E4 (period)

Example: [Church of Notre Dame (E18)] belongs stylistically to [Gothic Period (E4)]

Deprecated Shortcuts

OA4 "ends within"

OA4 is used to link the end of a persistent item's (E77) life span (or time of usage) to a certain timespan.
E77 (Persistent Item) - P93i (was taken out of existence by) - E64 (end of Existence) - P4 (has time span) - E52 (Time Span)

Example: [The one ring (E22)] was destroyed by [Destruction of the one ring (E12)] has time span [Late Third Age (E52)]

OA3 "begins within"

OA3 is used to link the beginning of a persistent item's (E77) life span (or time of usage) to a certain timespan.
E77 (Persistent Item) - P92i (was brought into existence by) - E63 (Beginning of Existence) - P4 - E52 (Timespan)

Example: [Holy Lance (E22)] was brought into existence by [forging of Holy Lance (E12)] has time span [Carolingian Period (E52)]

Miscellaneous

In our model it is possible to link from E1 with P2 to E59


Clean code draft

Comments

Files

Functions

Control structures


Code checker

Pylint

Pylint, checks for errors in Python code, tries to enforce a coding standard and looks for code smells.
It's available as PyCharm plugin and Debian package. The configuration file, .pylintrc is in the project root (at least in develop branch currently).
Install e.g. on Debian

# apt install pylint3

Then you can either run it in PyCharm (you may have to specify path to executable e.g. /usr/bin/pylint3 in module options)
or execute it in the command line from inside the openatlas directory with:
$ pylint3 openaltas

SonarQube

SonarQube is an open source code scanner that takes some effort to set up but gives quite interesting statistics and hints about security, readability, ...

Tabnanny

Tabnanny checks your source code for ambiguous indentation. To run in the project root (which should produce no errors):

python3 -m tabnanny .

Black

Black is a Python code formatter. I personally don't like the string and parenthesis formatting but it could still be useful to check the code with it from time to time.
To install on Debian and run tests in project root without writing it to files:

apt install black
black --diff -l 100 -S .

In evaluation


Code review

Code review (Wikipedia) is an essential tool when developing quality software. We welcome interested persons and provide some general information about it here.

How to start

The code is available at GitHub and you'll find links to demo versions and manual, used technologies and much more on the OpenAtlas website.
Information about development is available here, in our Redmine Wiki.
We recommend using your favorite editor to analyze the code and install OpenAtlas locally to e.g. run tests.

Etiquette

Giving and receiving critique can be difficult, we are humans after all, but there are some things to make it easier and friendlier for both parties involved:

A good read about working on code together is The Ten Commandments of Egoless Programming, as originally established in Jerry Weinberg's book.

What to look for

How to participate

When you find issues we like to hear about it and there are some ways to tell us:

Model and concepts

These documents were written in 2015 and may be quite outdated. They are kept for historical reasons.

Mappings - How OpenAtlas maps its information within the CIDOC CRM (Examples)
Graphical User Interface - Concept, Fields, Forms and Content of the GUI
Localisation - Spatial position of physical things

Except where otherwise noted, content on this site is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License

External Links

CIDOC - http://www.cidoc-crm.org
CIDOC Eigenschaften - http://cidoc-crm.gnm.de/wiki/Eigenschaften
DPP Map Viewer (experimental): http://dev.geo.univie.ac.at/projects/dpp/#activetypes=&center=41.226183305514596%2C22.851562500000004&selection=&selectioncategory=&time=300%2C1500&zoom=8


CONNEC 6.1.0 event update

UPDATE model.entity SET class_code = 'E9', system_class = 'move' WHERE id IN (
SELECT id FROM model.entity WHERE id in (7511, 8215, 8420, 8422, 8770) AND class_code = 'E7');
UPDATE model.entity SET class_code = 'E9', system_class = 'move' WHERE id IN (
SELECT id FROM model.entity WHERE id in (1124, 1418, 950, 1409) AND class_code = 'E7');

CONNEC 3.20.0 update scripts

Transform all events with type letter exchange to move event:

UPDATE model.entity SET class_code = 'E9' WHERE id IN (
    SELECT e.id FROM model.entity e
    JOIN model.link l ON e.id = l.domain_id AND l.range_id = 639 AND e.class_code = 'E7');

Update all move locations to start locations:

UPDATE model.link SET property_code = 'P27' WHERE id IN (
    SELECT l.id FROM model.link l
    JOIN model.entity e ON l.domain_id = e.id AND l.property_code = 'P7' AND e.class_code = 'E9');

CONNEC 3.20.1 update scripts

Remove actors from move events and add them to source

BEGIN;

UPDATE model.entity SET class_code = 'E9' WHERE id IN (
    SELECT e.id FROM model.entity e
    JOIN model.link l ON e.id = l.domain_id AND l.range_id = 939 AND e.class_code = 'E7');

UPDATE model.link SET property_code = 'P27' WHERE id IN (
    SELECT l.id FROM model.link l
    JOIN model.entity e ON l.domain_id = e.id AND l.property_code = 'P7' AND e.class_code = 'E9');

INSERT INTO model.link (domain_id, range_id, property_code) 
    SELECT el.domain_id, l.range_id, 'P67' FROM model.link l
    JOIN model.entity e ON l.domain_id = e.id AND l.type_id IN (862, 1091, 943, 1046, 1045)
    JOIN model.link el ON e.id = el.range_id AND el.property_code = 'P67'
    JOIN model.entity s ON el.domain_id = s.id AND s.class_code = 'E33';

DELETE FROM model.link WHERE id in (
    SELECT l.id FROM model.link l
      JOIN model.entity e ON l.domain_id = e.id AND l.type_id IN (862, 1091, 943, 1046, 1045)
      JOIN model.link el ON e.id = el.range_id AND el.property_code = 'P67'
      JOIN model.entity s ON el.domain_id = s.id AND s.class_code = 'E33'
); 

COMMIT;

Remove description form move events and add it to source description.

BEGIN;

UPDATE model.entity s SET description = description || E'\r\n----\r\n' || (
    SELECT e.description
    FROM model.entity e
    JOIN model.link l ON e.id = l.range_id AND l.property_code = 'P67' and e.class_code = 'E9' AND l.domain_id = s.id AND e.id NOT IN (1672, 1617, 1612, 1673, 1674, 1433, 1421, 1663, 1619, 1435, 1444, 1443, 1596, 1603, 826, 1496, 1493))
WHERE id IN (
    SELECT l.domain_id
    FROM model.entity e
    JOIN model.link l ON e.id = l.range_id AND l.property_code = 'P67' and e.class_code = 'E9' AND e.id NOT IN (1672, 1617, 1612, 1673, 1674, 1433, 1421, 1663, 1619, 1435, 1444, 1443, 1596, 1603, 826, 1496, 1493));

UPDATE model.entity SET description = ''
WHERE id IN (
    SELECT l.range_id
    FROM model.entity e
    JOIN model.link l ON e.id = l.range_id AND l.property_code = 'P67' and e.class_code = 'E9' AND e.id NOT IN (1672, 1617, 1612, 1673, 1674, 1433, 1421, 1663, 1619, 1435, 1444, 1443, 1596, 1603, 826, 1496, 1493));    

COMMIT;

Join references

UPDATE model.link SET domain_id = 3204
WHERE property_code = 'P67' AND domain_id IN 
(3216, 3218, 3222, 3230, 3234, 3238, 3285, 3287, 3705, 3713, 3715, 3719, 3745, 3815, 3845, 3849, 3853, 4272, 4276, 4281, 4286, 4293, 4297, 4301, 4367, 4369, 4374, 4494, 4731, 4735, 4742, 4926, 5130, 5132, 5137, 5141, 5148, 5149, 5154, 5158, 5232, 5236, 5240, 5245, 5264, 5269, 5273, 5277, 5281, 5286, 5290, 5294, 5295, 5299, 5303, 5307, 5311, 5315, 5319);

DELETE FROM model.entity WHERE id IN
(3216, 3218, 3222, 3230, 3234, 3238, 3285, 3287, 3705, 3713, 3715, 3719, 3745, 3815, 3845, 3849, 3853, 4272, 4276, 4281, 4286, 4293, 4297, 4301, 4367, 4369, 4374, 4494, 4731, 4735, 4742, 4926, 5130, 5132, 5137, 5141, 5148, 5149, 5154, 5158, 5232, 5236, 5240, 5245, 5264, 5269, 5273, 5277, 5281, 5286, 5290, 5294, 5295, 5299, 5303, 5307, 5311, 5315, 5319);

Content of this site has found a new home at https://openatlas.eu/cooperation


Content of this site has found a new home at https://openatlas.eu/cooperation/information


CORS

To allow Cross Origin Resource Sharing (CORS), OpenAtlas API uses flask-cors. Every path of the /api/ is protected, but the access can come from everywhere right now ('*')

cors = CORS(app, resources={r"/api/*": {"origins": app.config['CORS_ALLOWANCE']}})

Origins point to a global variable, which can be changed in the instance/production.py. Default value:

 CORS_ALLOWANCE = '*'  

The value can be a case-sensitive string, for a single point of origin, a regex expression, a list or an asterisk (*) as wildcard.
Examples:

CORS_ALLOWANCE = 'https://thanados.net/'
CORS_ALLOWANCE = ['https://thanados.net/', 'https://openatlas.eu/']
CORS_ALLOWANCE = r'^((https?:\/\/)?.*?([\w\d-]*\.[\w\d]+))($|\/.*$)'

Links

https://flask-cors.readthedocs.io/


Dates

The OpenAtlas data model can store chronological information for certain entities and properties.
In general it can document a timespan for the begin and a timespan for the end of these. The smallest timespan unit possible is one day. There are no restrictions regarding the length of these time spans.

E.g. if you you do not know the exact date of an actor's birth but only that she/he was born at the earliest in 800AD and at the latest before 805AD this timespan would range from Jan, 1st,800 to the Jan.1st 805. Given that person died on Aug. 23rd in 877 you would only enter that day as and end-date. In the user interface this case would look like:

The system automatically creates the correct timestamps given by the bounding dates provided by the user:

This way you can store chronological information as precise as possible respectively as fuzzy as necessary. Also it is possible to add a comment on the date e.g. "circa".
The same principle works for all of the following entities and properties:

Entities
Physical Things
Places (E18)
Features (E18)
Stratigraphic Units (E18)
Finds (E22)
Actors
Persons (E21)
Groups (E74)
Legal Bodies (E40)
Events
Activity (E7)
Acquisition (E8)
Production (E12)
Destruction (E6)
Properties that link actors to Events
performed (P14)
participated in (P11)
acquired title through (P22)
surrendered title through (P23)
Properties that link actors to Actors
has relationship to (OA7)
is current or former member of (P107)

The data is stored in the table model.entity respectively model.link in the fields begin_from, begin_to, begin_comment, end_from, end_to, end_comment as timestamps.
Depending on class of the entity respectively the domain and range classes of the link these dates can be mapped as time primitive (E61) entities within the CIDOC CRM.
The respective paths are the following:

E77 Persistent Item begin linked with a E61 Time Primitive:
E77 (Persistent Item) - P92i (was brought into existence by) - E63 (Beginning of Existence) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [Holy Lance (E22)] was brought into existence by [forging of Holy Lance (E12)] has time span [Moment/Duration of Forging of Holy Lance (E52)] ongoing throughout [0770-12-24 (E61)]

E77 Persistent Item end linked with a E61 Time Primitive:
E77 (Persistent Item) - P93i (was taken out of existence by) - E64 (End of Existence) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [The one ring (E22)] was destroyed by [Destruction of the one ring (E12)] has time span [Moment of throwing it down the lava (E52)] ongoing throughout [3019-03-25 (E61)]

E21 Person's Birth linked with a E61 Time Primitive:
E21 (Person) - P98i (was born) by - E67 (Birth) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [Stefan (E21)] was born by [birth of Stefan (E12)] has time span [Moment/Duration of Stefan's birth (E52)] ongoing throughout [1981-11-23 (E61)]

E21 Person's Death linked with a E61 Time Primitive:
E21 (Person) - P100i (died in) - E69 (Death) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [Lady Diana (E21)] died in [death of Diana (E69)] has time span [Moment/Duration of Diana's death (E52)] ongoing throughout [1997-08-31 (E61)]

E2 Temporal Entity (also property) begin linked with a E61 Time Primitive:
E2 (Temporal Entity) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [Thirty Years' War (E7)] has time span [Moment/Duration of Beginning of Thirty Years' War (E52)] ongoing throughout [1618-05-23 (E61)]

E2 temporal entity (also property) end linked with a E61 Time Primitive:
E2 (temporal entity) - P4 (has time span) - E52 (Time Span) - P81 (ongoing throughout) - E61 (Time Primitive)

Example: [Thirty Years' War (E7)] has time span [Moment/Duration of End of Thirty Years' War (E52)] ongoing throughout [1648-10-24 (E61)]


SQL statements used for producing demo data

Extract data for demo

Todo: Adapt like demo-dev SQL


BEGIN;

-- Disable triggers, otherwise script takes forever and/or run into errors
ALTER TABLE model.entity DISABLE TRIGGER on_delete_entity;
ALTER TABLE model.link_property DISABLE TRIGGER on_delete_link_property;

-- Delete data from other users than Sonja and Petra
DELETE FROM model.entity WHERE id IN (
    SELECT entity_id FROM web.user_log
        WHERE action = 'insert'
        AND class_code IN ('E33', 'E6', 'E7', 'E8', 'E12', 'E21', 'E40', 'E74', 'E18', 'E31', 'E84')
        AND user_id NOT IN (21, 16));

-- Delete unrelated user
DELETE FROM web.user WHERE username NOT IN ('Alex', 'Demolina', 'jpreiser', 'pheinicker', 'sduenneb');

-- Insert demo user
INSERT INTO web.user (username, real_name, email, active, group_id, password) VALUES (
    'Demolina', 'Demolina', 'demolina@example.com', True, (SELECT id FROM web.group WHERE name = 'editor'),
    '$2b$12$9T05T1IiCnlEiUdf5gSosuSYewK5Rf4T/PwuvbSXEooR95BG2kgvG');

-- Disable email, set sitename and other settings
UPDATE web.settings SET value = '' WHERE name = 'mail';
UPDATE web.settings SET value = '' WHERE name LIKE 'mail_%';
UPDATE web.settings SET value = 'openatlas@craws.net' WHERE name LIKE 'mail_recipients_feedback';
UPDATE web.settings SET value = '1' WHERE name = 'file_upload_max_size';
UPDATE web.settings SET value = 'Demo' WHERE name = 'site_name';

-- Update content
UPDATE web.i18n SET text = '<p>Demo site for <a href="http://openatlas.eu/">OpenAtlas</a> projects. <a href="/login">Login</a>.</p>
<p>The data will be reset daily around midnight. Demo data kindly provided by:</p>
<p><strong>Mapping Medieval Conflicts (MEDCON). A digital approach towards political dynamics in the pre-modern period</strong><br /><br />MEDCON was funded within the go!digital-programme of the Austrian Academy of Sciences (OEAW) from October 2014 to May 2017 and hosted at the Institute for Medieval Research of OEAW The project headed by Johannes Preiser-Kapeller examined the explanatory power of concepts of social and spatial network analysis for phenomena of political conflict in medieval societies.<br /><br />The data presented in this demo version stems from two of MEDCON&acute;s case studies, &ldquo;Emperor Frederick III and the League of the Mailberger coalition in 1451/52&rdquo; (executed by Kornelia Holzner-Tobisch and Petra Heinicker) and &ldquo;Factions and alliances in the fight of Maximilian I for Burgundy&rdquo; (Sonja D&uuml;nnebeil).<br /><br />For further information on the project see: <a href="http://oeaw.academia.edu/MappingMedievalConflict" target="_blank" rel="noopener noreferrer">Mapping Medieval Conflict</a> or contact Johannes.Preiser-Kapeller@oeaw.ac.at.</p>
<p><strong>OpenAtlas</strong></p>' WHERE name = 'intro' AND language = 'en';
UPDATE web.i18n SET text = '<p style="text-align: left;">Demo Seite f&uuml;r <a href="http://openatlas.eu/">OpenAtlas</a> Projekte. Zum <a href="/login">Login</a>.</p>
<p>Die Daten werden t&auml;glich gegen Mitternacht zur&uuml;ckgesetzt. Demo Daten freundlicherweise zur Verf&uuml;gung gestellt von:</p>
<p><strong>Mapping Medieval Conflicts (MEDCON). A digital approach towards political dynamics in the pre-modern period</strong><br /><br />MEDCON wurde durch das go!digital-Programm der &Ouml;sterreichischen Akademie der Wissenschaften (&Ouml;AW) finanziert und vom Oktober 2014 bis zum Mai 2017 am Institut f&uuml;r Mittelalterforschung der &Ouml;AW durchgef&uuml;hrt. Das Projekt untersuchte unter der Leitung von Johannes Preiser-Kapeller die Erkl&auml;rungskraft von Konzepten der sozialen und geographischen Netzwerkanalyse f&uuml;r Ph&auml;nomene des politischen Konflikts in mittelalterlichen Gesellschaften.<br /><br />Die Daten, die in dieser Demo-Version pr&auml;sentiert werden, stammen aus zwei Fallstudien von MEDCON, &bdquo;Kaiser Friedrich III. und die Liga der Mailberger Koalition, 1451/52&ldquo; (durchgef&uuml;hrt durch Kornelia Holzner-Tobisch und Petra Heinicker) und &bdquo;Fraktionen und Allianzen im Kampf von Maximilian I. um Burgund&ldquo; (Sonja D&uuml;nnebeil).<br /><br />Weitere Informationen zum Projekt finden Sie hier: <a href="http://oeaw.academia.edu/MappingMedievalConflict" target="_blank" rel="noopener noreferrer">Mapping Medieval Conflict</a> (bzw. Kontakt: Johannes.Preiser-Kapeller@oeaw.ac.at).</p>
<p><strong>OpenAtlas</strong></p>' WHERE name = 'intro' AND language = 'de';
UPDATE web.i18n SET text = 'Webmaster: alexander.watzinger@craws.net' WHERE name = 'contact' AND language = 'en';
UPDATE web.i18n SET text = 'Webmaster: alexander.watzinger@craws.net' WHERE name = 'contact' AND language = 'de';
UPDATE web.i18n SET text = '' WHERE name = 'legal_notice' AND language = 'en';
UPDATE web.i18n SET text = '' WHERE name = 'legal_notice' AND language = 'de';

-- Delete orphans manually because triggers are disabled
DELETE FROM model.entity WHERE id IN (
   SELECT e.id FROM model.entity e
        LEFT JOIN model.link l1 on e.id = l1.domain_id
        LEFT JOIN model.link l2 on e.id = l2.range_id
        LEFT JOIN model.link_property lp2 on e.id = lp2.range_id
        WHERE
            l1.domain_id IS NULL
            AND l2.range_id IS NULL
            AND lp2.range_id IS NULL
            AND e.class_code IN ('E61', 'E41', 'E53', 'E82'));

-- Delete orphaned translations
DELETE FROM model.entity WHERE system_type = 'source translation' AND id NOT IN (SELECT range_id FROM model.link WHERE property_code = 'P73');

-- Re-enable triggers
ALTER TABLE model.entity ENABLE TRIGGER on_delete_entity;
ALTER TABLE model.link_property ENABLE TRIGGER on_delete_link_property;

COMMIT;

Extract data for demo-dev

After executing test for orphaned locations and delete them with SQLs above.

-- SQL to filter demo data from DPP

BEGIN;

-- Disable triggers, otherwise script takes forever and/or runs into errors
ALTER TABLE model.entity DISABLE TRIGGER on_delete_entity;

-- Delete data from other case studies
DELETE FROM model.entity WHERE id NOT IN
    (SELECT e.id FROM model.entity e
    JOIN model.link l ON
        e.id = l.domain_id
        AND l.property_code = 'P2'
        AND l.range_id IN (SELECT id FROM model.entity WHERE name IN ('Ethnonym of the Vlachs')))
AND class_code IN ('E33', 'E6', 'E7', 'E8', 'E12', 'E21', 'E74', 'E40', 'E31', 'E18', 'E84', 'E22')
AND (system_type IS NULL OR system_type NOT IN ('source translation'));

-- Delete orphans manually because triggers are disabled
DELETE FROM model.entity WHERE id IN (
   SELECT e.id FROM model.entity e
        LEFT JOIN model.link l1 on e.id = l1.domain_id
        LEFT JOIN model.link l2 on e.id = l2.range_id
        WHERE
            l1.domain_id IS NULL
            AND l2.range_id IS NULL
            AND e.class_code IN ('E61', 'E41', 'E53', 'E82'));

-- Delete orphaned translations
DELETE FROM model.entity WHERE system_type = 'source translation' AND id NOT IN (SELECT range_id FROM model.link WHERE property_code = 'P73');

-- Delete unrelated user
DELETE FROM web.user WHERE username NOT IN ('Alex', 'dschmid', 'bkoschicek', 'mpopovic', 'jnikic');

-- Insert demo user
INSERT INTO web.user (username, real_name, email, active, group_id, password) VALUES (
    'Demolina', 'Demolina', 'demolina@example.com', True, (SELECT id FROM web.group WHERE name = 'editor'),
    '$2b$12$9T05T1IiCnlEiUdf5gSosuSYewK5Rf4T/PwuvbSXEooR95BG2kgvG');

-- Disable email, set sitename and other settings
UPDATE web.settings SET value = '' WHERE name = 'mail';
UPDATE web.settings SET value = '' WHERE name LIKE 'mail_%';
UPDATE web.settings SET value = 'openatlas@craws.net' WHERE name LIKE 'mail_recipients_feedback';
UPDATE web.settings SET value = '1' WHERE name = 'file_upload_max_size';
UPDATE web.settings SET value = 'Development Demo' WHERE name = 'site_name';
UPDATE web.settings SET value = 'Development Demo' WHERE name = 'site_header';

-- Update content
UPDATE web.i18n SET text = '<p>Development Demo site for <a href="http://openatlas.eu/">OpenAtlas</a> projects. <a href="/login">Login</a>.</p>
<p>The data will be reset daily around midnight. Demo data kindly provided by:</p>
<p><strong>The Ethnonym of the Vlachs in the Written Sources and the Toponymy in the Historical Region of Macedonia</strong> (11th-16th Cent.) <a href="http://dpp.oeaw.ac.at/index.php?seite=CaseStudies&amp;submenu=skopje" target="_blank" rel="noopener noreferrer">More Information</a></p>
<p>The present demo version is the result of a scholarly project, which was submitted by the digital cluster project &ldquo;Digitising Patterns of Power (<a href="http://dpp.oeaw.ac.at/" target="_blank" rel="noopener noreferrer">DPP</a>)&rdquo; at the Institute for Medieval Research (Austrian Academy of Sciences, Vienna) and the Ss. Cyril and Methodius University of Skopje (Faculty of Philosophy, Institute for History). It focuses on the interplay between the resident population and the nomads (i.e. the Vlachs) in the historical region of Macedonia from the 11th to the 16th centuries.<br /><br />This region at the crossroads of Orthodoxy, Roman Catholicism and Islam and the question of the origin of the Vlachs, who identify themselves as a separate ethnic group until modern times, as well as the ethnonym "Vlachs" and its derivatives in the form of toponyms and personal names are at the core of the joint research. Hereby, historical and archaeological research is combined with Digital Humanities.<br /><br />The project, which was successfully submitted by the project coordinators Doz. Dr. Mihailo Popović and Prof. Dr. Toni Filiposki, is funded by the Centre for International Cooperation &amp; Mobility (ICM) of the Austrian Agency for International Cooperation in Education and Research (OeAD-GmbH) for two years (2016-18) and forms an additional case study within DPP. <br /><br />Project teams:<br /><br />Toni Filiposki (project leader / Skopje), Boban Petrovski (Skopje), Nikola Minov (Skopje), Vladimir Kuhar (Skopje), Boban Gjorgjievski (Skopje)<br /><br />Mihailo Popović (project leader / Vienna), Jelena Nikić (Vienna), David Schmid (Vienna)</p>
<p><strong>OpenAtlas</strong></p>' WHERE name = 'intro' AND language = 'en';
UPDATE web.i18n SET text = '<p style="text-align: left;">Development Demo Seite f&uuml;r <a href="http://openatlas.eu/">OpenAtlas</a> Projekte. Zum <a href="/login">Login</a>.</p>
<p>Die Daten werden t&auml;glich gegen Mitternacht zur&uuml;ckgesetzt. Demo Daten freundlicherweise zur Verf&uuml;gung gestellt von:</p>
<p><strong>The Ethnonym of the Vlachs in the Written Sources and the Toponymy in the Historical Region of Macedonia</strong> (11th-16th Cent.) <a href="http://dpp.oeaw.ac.at/index.php?seite=CaseStudies&amp;submenu=skopje" target="_blank" rel="noopener noreferrer">More Information</a></p>
<p>The present demo version is the result of a scholarly project, which was submitted by the digital cluster project &ldquo;Digitising Patterns of Power (<a href="http://dpp.oeaw.ac.at/" target="_blank" rel="noopener noreferrer">DPP</a>)&rdquo; at the Institute for Medieval Research (Austrian Academy of Sciences, Vienna) and the Ss. Cyril and Methodius University of Skopje (Faculty of Philosophy, Institute for History). It focuses on the interplay between the resident population and the nomads (i.e. the Vlachs) in the historical region of Macedonia from the 11th to the 16th centuries.<br /><br />This region at the crossroads of Orthodoxy, Roman Catholicism and Islam and the question of the origin of the Vlachs, who identify themselves as a separate ethnic group until modern times, as well as the ethnonym "Vlachs" and its derivatives in the form of toponyms and personal names are at the core of the joint research. Hereby, historical and archaeological research is combined with Digital Humanities.<br /><br />The project, which was successfully submitted by the project coordinators Doz. Dr. Mihailo Popović and Prof. Dr. Toni Filiposki, is funded by the Centre for International Cooperation &amp; Mobility (ICM) of the Austrian Agency for International Cooperation in Education and Research (OeAD-GmbH) for two years (2016-18) and forms an additional case study within DPP. <br /><br />Project teams:<br /><br />Toni Filiposki (project leader / Skopje), Boban Petrovski (Skopje), Nikola Minov (Skopje), Vladimir Kuhar (Skopje), Boban Gjorgjievski (Skopje)<br /><br />Mihailo Popović (project leader / Vienna), Jelena Nikić (Vienna), David Schmid (Vienna)</p>
<p>&nbsp;<strong>OpenAtlas</strong></p>' WHERE name = 'intro' AND language = 'de';
UPDATE web.i18n SET text = 'Webmaster: alexander.watzinger@craws.net' WHERE name = 'contact' AND language = 'en';
UPDATE web.i18n SET text = 'Webmaster: alexander.watzinger@craws.net' WHERE name = 'contact' AND language = 'de';
UPDATE web.i18n SET text = '' WHERE name = 'legal_notice' AND language = 'en';
UPDATE web.i18n SET text = '' WHERE name = 'legal_notice' AND language = 'de';

-- Re-enable triggers
ALTER TABLE model.entity ENABLE TRIGGER on_delete_entity;

COMMIT;

Deprecated

HTTP Request with json body

The API can requested with 3 different parameters with a json payload to /api/0.1/. It is very important, that every value has to be a list[]! The sequence of the occurrence is not important.

{
    "id": [15],
    "item": ["place", "source"],
    "class_code": ["E18"],
    "latest": [5]
}
curl --location --request GET 'http://127.0.0.1:5000/api/0.1/' \
--header 'Content-Type: application/json' \
--header 'Cookie: session=.eJxtk8mO2zAMht9F52CytDMofOsT9NJbURCMRducaoNE1UEG8-6lnARxg1xk6f9IWlz0YWDIVCbTDegKbYzDMFYcyXSGgtmYQiIcxmK6D4OJIdWj417pz1xJuaVjHcFH2zyW84DVCTzGuemCR0eQ46wRD68bMyA7suDiyAGGmEcS8ByqkBrsH7hkbvIXlVWFmlxEC-hcnNWGTkKhcAym-2VGHvSv74nG5dPWZJuUQtvLSXQ9czK__w_m8QSFz3rv_W5jRooBPRWo2Wkmk0gq3XY7z_PLDb3onbdmbVoot53ax0QBxWFRrhmAo7_U4rxdzhGWP7O9lM5rqved9iV6oGfiNfpNy9RzYgpSYCCyR-z_tAq0zBYuGUNJMQtMscjK8Q7a8hSskllggt7VIpTBcllaiQLnGL0a7A8PJpq8Wtj7sKxhK3RGy1Ubal53V9pCwXVW1iEXXV2a9q1pHNhXD-9FMhEUwtxPDa5YwlLmmHV4KIyidH_Q9ud4KbrX4YSZbQPmsGsX0KxtfOb3poz0JUAfw8DZayFrbgP8VR8IC8FEaClfirQI15r90AH4vgzA5-c_-Lgv7A.XuaMAA.Jjnf9MaToIdph8sfXIfXsHQLWDY' \
--data-raw '{
    "id": [115],
    "item": ["place", "source"],
    "class_code": ["E18"],
    "latest": [5]
}'

id only takes digits
item only takes place, source, reference, actor, event, object
class_code only takes the cidoc class code
latest only takes digits and only the first position counts

If duplicates occur, only the last of in the list will be shown, e.g.:

{
    "id": [15],
    "id": [20]
}

Only the entity with the id 20 will be outputted as json


Discussions

Done

* Do we allow the API to be accessed anonymously only after the data is already open or do we want a protected service. If yes, how can we secure it?
* there are multiple levels of access restriction, some on protocol level (such as CORS), some on content level (such as AUTH requirements)
* generally it should be considered if the API should provide CRUD functionality or be read only
* What are the use cases? What queries do we want?
* Password or token based authentication?
* What shape type should we give an entity without real geometry? I would give it "Point" just out of simplicity
* Is it really necessary for each project that we will give valid geojson? e.g. actor has geometry. Should we include more json schemas?

To discuss:

Discussion for 27.11

Discussion outcome:

21.02.

The development of OpenAtlas depends on many factors and is very fluid. Here you find explanations of keywords and concepts used in planning.

Feature

A feature is an isolated task. It can be a new functionality (e.g. an upload function for a logo), added functionality to an existing feature (e.g. adding new export formats) or a fix for a bug (e.g. repairing a button that isn't working as expected). Ideally, it should not take more than a week to implement one feature. If it is expected that a feature takes much longer, we try to break it up into smaller tasks. Features are either planned in meetings or requested by users.

Version

The version naming scheme is sequence-based and reflects the significance: major.minor.fix e.g. 3.11.1

Major

The first number is raised rarely and symbolizes major changes, e.g. after the whole application was rewritten in a new language (from PHP to Python) the first number was raised from 2 to 3.

Minor

The second number is the one that is raised most often. It includes a collection of features, typically around two to four, and should be doable in about a month. When a minor version is finished and uploaded to the productive systems it is also a good time to check how the development goes along and to make adaptations to the planning if needed.

Fix

The third number is for fixing errors. Since we think that errors should be resolved as fast as possible we often don't want to wait a month for the next minor release, especially on productive system were people are working on their projects. These are quite infrequent depending on reported errors and their gravity.

Roadmap

There are many feature requests (ideas for new functionality). Usually we plan ahead about three minor versions (around ten features, doable in about a quarter of a year) and call it the Roadmap. The roadmap has to be flexible because of new projects or changed requirements of existing ones. E.g. new requirements are often beneficial for multiple projects and so the priorities can shift to reflect this.

Many factors come into play when deciding which features are put onto the roadmap. One major factor are the requirements of projects who are financing OpenAtlas. But there are other factors as well like

Wishlist

The wishlist is a special version in the roadmap. It is a collection of ideas and suggestions which we would like to implement in the future, often containing information and thoughts. In a new version we not only include critical features, but also try to implement features from the wishlist. The wishlist is, like all documentation, open for the public so other projects or involved members can browse through it and identify features, which are imperative for their needs.

If and when a feature is taken from the wishlist and included in a new version depends on several factors like funding, the usefulness for the projects’ majority, if features need prerequisites to be fulfilled, etc. It also can happen, that features which are already planned for the next versions are moved back to the wishlist, e.g. if it turns out to be much more time consuming than expected or if the project requesting that feature decides to change their own priorities.


Feature votes

To provide more options to participate in our workflow we introduced voting for features:

We try to keep this list current and take your votes (query) into account when planning next features. Please keep in mind that there is no guarantee because there are others criteria as well e.g. there may be technical prerequisites.
Sadly the very old request (2008) Add voting to tickets was never implemented (I voted 5 years ago, maybe you want to add a +1 comment there too) so we have to do it manually.

Votes

# Feature Prerequisite
3 #1285 Improve value types display
1 #1352 Tool for Anthropological Analyses
1 #1280 Picture Preview
1 #1047 Import geometries
1 #1400 Make specific types required at data entry
1 #1445 Anthropological sex estimation
User Votes Done
Bernhard Koschiček-Krombholz #1285 #1280 #1047
Stefan Eichert #1352 #1285 #1400 #1091 #1215
Alexander Watzinger #1285 #1445

Useful git configuration settings

These options can be configured in your global git config file e.g. ~/.gitconfig on Linux:

[user]
        name = Your Name
        email = your@email.net
[color]
        ui = true
[core]
        editor = vim
[fetch]
        prune = true
[merge]
        tool = meld
[mergetool]
        keepBackup = false
[status]
        showUntrackedFiles = all

Or using shell commands e.g.

git config --global fetch.prune true

Prompt with branch and dirty indicator

vim ~/.bashrc

function parse_git_dirty {
    [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*" 
}
function parse_git_branch {
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/[\1$(parse_git_dirty)]/" 
}
PS1='\[\e[1;34m\]\u@\h:\w\[\e[0;32m\]$(parse_git_branch)\[\e[1;34m\]\$ \[\e[m\]'

Git Workflow

We are using git as a versioning system using the Git Branching Workflows

Main branches

The branches in which the work (in progress) is happening have following prefixes:

Workflow

If working on a new feature/fix:

Around once a month a new version is released where the develop branch is merged into the main branch.

Database changes

If there are database changes make sure that

That way it's easier to deal with updates in the develop branch when dealing with multiple new features which need database updates.


This document was written in 2015 and may be quite outdated. It is kept for historical reasons.

Graphical User Interface

This section contains information on the web-based GUI of OpenAtlas for inserting, editing and managing data.

Login

Requirements: Before accessing the UI a user has to login with username and password. If the information is correct the user is redirected to a starting page.
Fields: Username, Password
Buttons: OK
Additional ideas: "forgot my password" button/hyperlink

Menu

A menu bar or something similar allowing the user to handle the UI. Global
tbd

Starting Page / Navigation

The first page displayed after login. Offering easy Navigation for the most often used things.
For now: Navigate between source and actor

Sources

Generally:
OpenAtlas uses Documents E31 and Linguistic Objects E33 to refer to other entities that are stored in the database.
To record that an Information object or document like an image, an article, a book (E31) or the text of a charter (E33) refers to another entity p67 refers to / is referred to by is used.

A page to insert, edit sources like texts (e.g. medieval charters, journal articles, bibliographic references) or images (photographs, drawings, maps).
Prerequisite: Dublin Core: http://de.wikipedia.org/wiki/Dublin_Core
--> Record 15 core elements:
Fundamental Question: How to handle the metadata?

Map them within CIDOC CRM?: http://www.cidoc-crm.org/docs/dc_to_crm_mapping.pdf
Or add metadata in HTML/RDF/XML?: http://de.wikipedia.org/wiki/Dublin_Core#Anwendungen_von_Dublin_Core
Text Sources/integrate BibTex Format? http://bibtexml.sourceforge.net/

Suggestion: Store metadata in separate table, using Dublin Core's - Core Elements. Import <> export from/to various formats (eg. RIS/Bibtex).

Texts/Bibliographic Information

User Interface for inserting/editing bibliographical information. Bibliographical information is stored as an entity of class E31 (document) that has the type "Text" or subtype. OpenAtlas will use Bibtex format stored as string in description field to record bibliographical entries. http://en.wikipedia.org/wiki/BibTeX

Types:

Referenzart Beschreibung erforderliche Felder optionale Felder
article Zeitungs- oder Zeitschriftenartikel author, title, journal, year volume, number, pages, month, note
book Buch author oder editor, title, publisher, year volume oder number, series, address, edition, month, note, isbn
booklet Gebundenes Druckwerk title author, howpublished, address, month, year, note
conference Wissenschaftliche Konferenz author, title, booktitle, year editor, volume oder number, series, pages, address, month, organization, publisher, note
inbook Teil eines Buches author oder editor, title, chapter und/oder pages, publisher, year volume oder number, series, type, address, edition, month, note
incollection Teil eines Buches (z. B. Aufsatz in einem Sammelband) mit einem eigenen Titel author, title, booktitle, publisher, year editor, volume oder number, series, type, chapter, pages, address, edition, month, note
inproceedings Artikel in einem Konferenzbericht author, title, booktitle, year editor, volume oder number, series, pages, address, month, organization, publisher, note
manual Technische Dokumentation address, title, year author, organization, edition, month, note
mastersthesis Diplom-, Magister- oder andere Abschlussarbeit (außer Promotion) author, title, school, year type, address, month, note
misc beliebiger Eintrag (wenn nichts anderes passt) - author, title, howpublished, month, year, note
phdthesis Doktor- oder andere Promotionsarbeit author, title, school, year type, address, month, note
proceedings Konferenzbericht title, year editor, volume oder number, series, address, month, organization, publisher, note
techreport veröffentlichter Bericht einer Hochschule oder anderen Institution author, title, institution, year type, note, number, address, month
unpublished nicht formell veröffentlichtes Dokument author, title, note month, year

The UI takes the user Input from the text boxes, generates a string like the following and stores it in the "description" field.

@Book{hicks2001,
 author    = "von Hicks, III, Michael",
 title     = "Design of a Carbon Fiber Composite Grid Structure for the GLAST
              Spacecraft Using a Novel Manufacturing Technique",
 publisher = "Stanford Press",
 year      =  2001,
 address   = "Palo Alto",
 edition   = "1st",
 isbn      = "0-69-697269-4" 

The UI displays a formatted version of this bibliographical entry in the "reference" tab and the Source Text in the "source" tab.
Idea for future developments: Import/Export .bib format

Any entity can be linked via P67 "is referred to by" to a document.

Images

Suggestion: at least Dublin Core + Technical Metadata like EXIF

Historical Sources

Historical sources (E.g. medieval charters, chronicles etc.) are documented on three levels: 1. Content, 2. Bibliographical Reference and 3. Information Carrier
The main node for recording historical sources is an E33 entity with the type "source content". All other entities are connected to this node.
Name: stored in identifier field.
Classification: P2 "has type" link to E55 type "Primary Source" or Subtype (e.g. charter...).

Content

Content of a written historical source is documented as E33 (Linguistic Object). Three parts are recorded:

Abstract/Content: E33 with a Type E55 that is "Source Content" = Summary of source's content and main node for further links. Stored in the entity's description field.

Translated Content: E33 with a Type E55 that is "Source Translation" = full text translated.
Link: "Source Content" via p73 "has translation" to the "Source Translation" (1 - n). Name and type of this entity are automatically generated by the ui. Type is "Source Translation" and the name something like name of source content + suffix "transl"

Original: E33 with a Type E55 that is "Source Original Text" = full text original.
Link: "Source Content" via p73 "has translation" to the "Source Original" (1 - n) Name and type of this entity are automatically generated by the ui. Type is "Source Original Text" and the name something like name of source content + suffix "orig"

Bibliographical References

The content (=E33 with type "Source Content") can be linked to various bibliographical references (E31 document) (1 - n). They can be for example various editions of charters in which the respective source is documented. Also secondary literature like articles, descriptions, discussions of this source can be linked to the E33 "Source Content" object via P67 "is referred to by".

Information Carrier

The content (=E33 "Source Content") can be linked (1 - n: via p128 "is carried by") to the physical object that serves as Information Carrier (E 84) like for example the charter made of parchment that, as physical object, can have a location, an owner etc.

Source Mapping: CIDOC-Mappings

Insert new source:

source content linked (p67i is referred to by) 1-n to editions (=document E31 with type charter)
source content linked (p128i is carried by) 1-n to information carriers (e84)

Later displayed in the info field of the source/document

Information Carrier as physical Objects

Every content may have a physical object that carries the respective Information. In the case of historical research this will most probably be charters as physical objects that have a certain place in space and time that can of course change too.

For the first version we will use an "Information carrier light" form

Fields:

Information Carrier name (entity name); description + "überlieferung" (entity description)
They represent an E84 Entity (Information Carrier) that is linked (here 1 source content - n inform. carrier) to the source content entity of the document (E33 with type "source content") via p128 (is carried by)

this E84 entity is linked to an E55 type Entity (from http://redmine.craws.net/projects/uni/wiki/Basic_Types#Information-Carrier-Types) that can be selected

Time and place of production: If necessary an invisible production event will be created and linked to the E84 entity. This production event can again be linked to time primitives (via oa5 and oa6) and to a place/location of a physical thing-combination.

deprecated:
This information carrier (Class E84) can be linked to various other nodes:
Owner: link from E86 via P49 ("has former or current owner") to Actor or Subclass (1 - 1): This is used to document e.g. the Archive or Library or Collection that keeps the respective charter.
Signatory: link from E86 via P105 ("right held by") to Actor or Subclass (1 - n): This is used to document the original contracting party, person or legal body for whom the charter was created.

If a charter was written for the medieval Monastery of Ötting because Ötting was the receiver of a donation from the King, this charter is used by the legal body Ötting to document the right of possession of a certain property. This charter today is kept in the Carinthian Archive "Kärntner Landesarchiv". The mapping would be like the following:

The information carrier was of course produced at a certain time and place and involved into this production were certain actors. The production of the object may also have been part of a superior event.
Thus the information carrier is automaticall linked to its production event and this event can be linked to various other entities (see last figure of the linked section).
Together with the connecting property in some cases a detailed definition can be stored in the link table. E.g. the role of a producing Actor (Writer, Sponsor) or the reference a charter has in a certain archive.

GUI by Christine for documents, modified by Stefan (meant as suggestion for discussion during next meeting)

Add new document Step 1:

Idea: Workflow for inserting documents

E33 linguistic object type "source content"

1. Type of document: select from "primary source" hierarchy (=link from E33 via P2 to E55) 1-1
necessary information

2. "Quellkürzel" = Name, Signature, Abbreviation or whatever identifies the document (=name of E33) 1-1
necessary information
only if the above two are inserted the others will activate

3.1. Edition: Charter editions, 1-n links from E33 via p67i to E31 (type "edition")
search for existing editions. If found: activate Pages
if not found: add new one in new tab/popup? and link to source content afterwards (automatically?)

3.2. Pages or nr are stored in links description
only active if Edition is selected.

3.3.
+ Add one more Edition link
- Remove: Ask if only link to E31 should be removed or the whole edition entry too
Edit: Edit edition entry

4.1 "Informationsträger" = original charter or physical thing that carries the information E33 linked via p128 to E84.
select existing ones, if found display respective information
If not found add new Information Carrier's name directly here. UI creates a E84 entry with this name and a link to E33

4.2. Pages or Nrs are stored in links description
only active if Edition is selected.

4.3. "Ausstellungsort" - "Place of Production": E18/E53 Combination linked via P7 to a production event E12 that p108 produced the Information carrier
if not yet defined: Select from existing places/physical things.
if not found: Add new one by entering name. If the location is desired, open detailed (Site) view by clicking on the globe Icon to select coordinates, geosearch or whatever you want to to on the map...

4.4. Time of Production OA5/OA6 links from E12 Production to Time Primitives from/to values.
if not yet defined: Use timespan menu for chronological Information

4.5. Buttons
+ Add one more Information Carrier
- Remove: Ask if only link to E84 should be removed or the whole information carrier network
Edit: Edit information carrier

5.1. Bibliographic Reference: Secundary Sources, 1-n links from E33 via p67i to E31 (type "secundary source")
search for existing references. If found: activate Pages
if not found: add new one in new tab/popup? and link to source content afterwards (automatically?)

3.2. Pages or nr are stored in links description
only active if Reference is selected.

3.3.
+ Add one more Reference link
- Remove: Ask if only link to E31 should be removed or the whole reference entry too
Edit: Edit reference entry

Events

OpenAtlas currently uses:
E5 (Event) in general to record events that are more detailed defined via p2 (has type) to E55 (Type). E.g. E5 (Event of Battle between Henry I. and the Hungarians) p2 has type E55 Battle (1-1)
E8 (Acquisition) to record events that change the ownership of something from one actor to another
E12 (Production) to record the creation/founding of something. E.g. the foundation of the Monastery of St. Peter in Salzburg.
E6 (Destruction) to record the destruction/end of something. E.g. the destruction of the church of St. Peter near Moosburg in a fire.

next to the general classification "types" defined freely by the users can be used to categorize the event's character. Event p2 has type(1-n) E55 (See Basic Types)

One event can be part of another event. E.g. the battle of Hastings (E5) was part of (p117 occurs during)the Norman conquest of England (E5); The Donation of the Church St. Peter near Osterwitz (E8) occurs during the Synody of Maria Saal 927 (E5): E5 or Subclass linked to E5 or Subclass via p117.

One event can take place (P7) at a certain physical thing/place (=E18+E53) like e.g. the court of Charlemagne in Aachen.

Further relations:

Events and actors:

CIDOC-Mappings

In this tab/section actors that are involved in this event should be listed. Their connection to the event is defined
1. by a property that marks the general involvement of the actor
p11 had participant/participated in
p14 carried out by/performed
p22 transferred title to/acquired title through
p23 transferred title from/surrendered title through

2. by a type that marks the role of the actor (Basic Types)
E55 type of the link/property
E.g. Michelangelo (E21) performed (p14) the painting of the Sistine Chapel (E12) in the role as Artist/Creator (E55) while Pope Julius II (E21) performed (p14) this production of the painting (E12) as sponsor (E55)

Events and Physical Things

Here (by now) only physical things are listed that are directly connected to the event E.g. if they are sold/donated/traded p24 transferred title of/changed ownership through within an acquisition event (E8).

Events and Sub Events

Here Sub-Events are listed that occur during the main event. They are linked via p117 to the superior event.

Actors

Class: [select Person/Group/Legal Body]

Name: [identifier = text]

Alternative Name(s): [1-n: P131 – E82] (visible after + button (next to name) is pressed)

Description: [text]

Begin: [1-1 Place, date, period; OA9 – E53; 0A1 – E61; OA2 - E4]
End: [1-1 Place, date, period; OA10 – E53; 0A3 – E61; OA4 - E4]

Residence: [1-n P74 – E53]

Connections to Events [1-n E39 + role + E5]

Affiliations: [1-n P107 – E39 + role E55]

Direct Relations to Persons: [1-n OA7 – E39 + role E55]

Indirect Relations to Actors: via Events
Indirect Relations to Places: via Events
Indirect Relations to Physical things: via Events
Direct Relations to Physical things: Property: [1-n P51i – E18]

Bibliography [1-n P67 - E31]
Primary Sources [1-n] P67 - E33
Images [P67 - E31]
External references [tbd]
Files [tbd]

Physical Things (Sites, Features, Stratigraphical Units and Finds)

Physical Things (non moveable as well as moveable) are mapped as a combination of an E18 (non moveable) or E19 (moveable = Finds) entity with an E53 Place entity via a P53 (has former or current location) link.

Type: [E18/E19 – p2 has type – E55] "Site", "Feature", "Stratigraphical Unit", "Find" or Subtype, Class (E18 or E19) is determined automatically as E18 or E19 depending on the GUI

Name: [identifier = text]

Alternative Name(s): [1-n: E18/E19 – P131 – E82] (visible after + button (next to name) is pressed)

Description: [text]

Begin: [E18/E19 – 0A1 – E61] with from-to values + suffix if necessary
In case this date is not known exactly, two time primitives can be recorded to mark a certain temporal span in which the beginning took place. The first timestamp therefore is connected (p2 has type) with a type (E52) "from value", the second with a "to value" type (=Subtypes of "Numeric Value Types"). If one exact date is known this one gets the type "exact value".

End: [E18/E19 – 0A2 – E61] with from-to values + suffix if necessary
In case this date is not known exactly, two time primitives can be recorded to mark a certain temporal span in which the end took place. The first timestamp therefore is connected (p2 has type) with a type (E52) "from value", the second with a "to value" type (=Subtypes of "Numeric Value Types"). If one exact date is known this one gets the type "exact value".

Image(s) [E18/19 - P67 - E31 + E55 "image"]

Easting: [number]
Northing: [number]
both values are stored as WGS84 coordinates in decimal degree format.

select from map: alternatively the user can select a point from the map and the coordinates will be retrieved from the geographical position of the mouse-click. The cursor should turn crosshairs when this option is active and the mouse moves into the map-window.

Map: leaflet map that shows the current physical things with the same supertype (e.g. Site) with some basic navigation and search functionality.

Question: Where to store the coordinates resp. where to create the postGIS Point geometry?
Needed columns:
Easting (double)
Northing (double)
EPSG/SRID (integer)
Geom (Point) ###important: PostGIS Point format, not Postgres Point format###

create a separate table? add columns to entity table?

Quality [E53 - p2 has type - E55 type of "Localisation Quality" Subtype] this option documents the spatial fuzzyness resp. the quality of the localisation. E.g. if the point is known exactly, located at an unknown position within a larger area etc.

Is situated within [E53 1-n p89 - (E53 + E5)] + record specifications like parcel number etc.

Evidence [E18/E19 - p2 has type - E55 type of "Evidence" Subtype]

Periods: tbd

further Relations:

Bibliography [1-n E18/E19 - P67 - E31+E55 "Text"]
Primary Sources [1-n E18/E19 - P67 - E33+E55 "Primary Source Content"]

Events that occur here or influence this place [tbd]
Actors linked to this place [tbd]
Files [tbd]
External references [tbd]
Features/Subunits [tbd]
Shapes [tbd]
Dimensions [tbd]

Tree Editor


Hackathon 2020-06-17 10:00

Participants: Bernhard Koschicek, Alexander Watzinger, Stefan Eichert, Christoph Hoffmann, Nina Brundke, Roland Filzwieser, Jennifer Portschy
Location: Museum of Natural History, Vienna

Log:

General:

Input Data:

UI

Profile


Icons

We are using Font Awesome icons, for using new icons take a look here


Image processing

Current branch: feature_api_image

Related tickets: #1280, #1426, #1492

image resizing

Currently, supported file formats: '.jpeg', '.jpg', '.png', '.tiff', '.tif', '.ico', '.svg', '.bmp', '.gif'

Thumbnails for OpenAtlas will be stored in /processed_images/resized/<size> folder with the same name as the original file but as jpeg. (e.g. 12345.jpg will get 12345.jpeg, 51242.pdf will get 51242.jpeg)

Default resize values:

The size of processed images will declare the px length of the longer side of a file.

Example: 6000x4000px JPG file with 8,23 mb will result in a 400x200px jpg file with 114kb uncompressed, if size is set to 400. Compression is set to 75%.

If the uploaded file is a 'gif' then the first frame, page, layer etc. will be used as thumbnail.

Creation

The creation of resized images will be triggered on upload if IMAGE_PROCESSING = True. Old files will be resized, if the file is directly called or through the processes of profile image display. So IMAGE_PROCESSING can also be activated within an ongoing project, and the files get resized if they are called.

Preview for file table

The user can activate the table preview on his profile settings. The preview has the table size which is 100px per default. The function itself is fast, but the browser need a lot of time to load the images.

API implementation

We also provide a dynamic resize of images. The endpoint /api/display/ takes has a new parameter named image_size, which will take a number. The number will be the pixel length of the longer side of the image, e.g. /api/display/130729.jpg?image_size=300 will create an image with the longer side 300px. The image is stored in openatlas/tmp and deleted after request.

Discussion

To consider:


Access

To create an issue you'll have to be a registered user. You can create an account at https://openaltas.eu/account/register. It will take a few hours up to a few days to get activated.

New Issue

You can create a new issue in a project by clicking on + "New Issue" in the menu.
An issue can be created for a bug, a feature, a question ... anything project specific you would like to keep track of.
Please make sure that your issue hasn't already been reported to avoid duplicates.

Fields

The important ones are subject and description, when in doubt leave the other fields empty. Most use cases are described below.

Subject (important)

A short description e.g. "Search function for people"

Description (important)

Describe your request or problem and provide an URL. A lot of information e.g. which version you use is available with just an URL.
If it is a bug the more information the better. e.g. if a button isn't working as expected providing the following would be very helpful:

For text formatting you can refer to the Redmine documentation

Tracker

This field is used to describe the type of issue.

Bug If you found an error.
Feature If you want a new feature e.g. you would like a search function for a list view.
Question If you want to ask something
Administration Administrative tasks e.g. a server upgrade or planning an event

Status

Leave on new if it's not yours to work on.

New It's a new issue.
Acknowledged It has been seen and accepted.
Assigned Someone is assigned to work on it.
In progress Someone began working on it.
Resolved It's dealt with but not closed, e.g. performance changes but it still has to be tested.
Closed The issue has been successfully dealt with. In case the issue isn't solved it will be reopened.
Rejected The issue was rejected with an explanation, e.g. it is not possible for technical reasons.
Duplicate The issue was already reported.

Priority

In most cases leave it on "low".
Since we have many projects most tickets are on low because the order in which things are done are defined in milestones.
Higher priorities are reserved for issues where immediate action is needed e.g. a site where people have work to do is down.

Assignee

Leave empty if it's not yours to work on. Choose yourself if you want to work on it. Of course the development team is free to assign tickets to each other.

Target version

Leave empty. It's for internal project planning.

Found in Version

For bugs only. The OpenAtlas version in which a bug had been found.

Roadmap

Which features are planned for future releases can be seen on the Roadmap
Please note that development on the OpenAtlas project is a fluid process and milestones will change depending on factors such as:


JSON Templates

This page represents the preliminary JSON-LD structure.

Ontologies

Feature Collection / Physical Thing

Preliminary JSON-LD:

{
   "@context":"https://raw.githubusercontent.com/LinkedPasts/linked-places/master/linkedplaces-context-v1.jsonld",
   "features":[
      {
         "@id":"https://thanados.openatlas.eu/entity/50505",
         "crmClass":"crm:E18_Physical_Thing",
         "depictions":[
            {
               "@id":"https://thanados.openatlas.eu/api/0.1/entity/112760",
               "license":"Bildzitat",
               "title":"thunau_modified" 
            }
         ],
         "description":[
            {
               "value":"In the area of Obere Holzwiese 215 inhumation burials were documented in different excavations. The cemetery ranges from the (later) 8th c. to the (early) 10th c.\r\n##German\r\n215 Bestattungen wurden im Bereich der Oberen Holzwiese dokumentiert; im NW-Areal wird eine Holzkirche vermutet, die wohl bereits in der ersten Hälfte des 9. Jahrhunderts vorhanden war." 
            }
         ],
         "geometry":{
            "coordinates":[
               15.6432715260176,
               48.5867361212989
            ],
            "type":"Point" 
         },
         "links":[
            {
               "identifier":"http://www.geonames.org/2763660",
               "type":"closeMatch" 
            }
         ],
         "names":[
            {
               "alias":"Thunau Obere Holzwiese" 
            }
         ],
         "properties":{
            "title":"Gars Thunau Obere Holzwiese" 
         },
         "relations":[
            {
               "label":"Cenotaph_A",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57167",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Excavation",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/5099",
               "relationType":"crm:P2_has_type" 
            },
            {
               "label":"Grave 001",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58775",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 002",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58763",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 003",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58799",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 004",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58811",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 005",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58817",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 006",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58823",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 007",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59201",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 008",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59207",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 009",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59189",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 010",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59195",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 011",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56623",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 012",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58835",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 013",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56629",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 014",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58841",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 015",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59213",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 016",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59219",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 017",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59231",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 018",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57175",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 019",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56685",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 020",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59237",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 021",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59267",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 022",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56635",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 023",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58895",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 024",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59249",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 025",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59255",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 026",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58907",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 027",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59279",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 028",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58913",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 029",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56691",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 030",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58919",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 031",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56641",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 032",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59165",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 033_036_038",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58925",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 034",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58931",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 035",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58937",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 037",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58889",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 039",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59243",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 040",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57181",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 041",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56703",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 042",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56715",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 043",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59285",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 044",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59291",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 045",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59315",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 046",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59327",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 047",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59333",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 048",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59345",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 049",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59351",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 050",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58949",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 051",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56679",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 052",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58955",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 053",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56647",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 054",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58967",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 055",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58973",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 056",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59363",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 057",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57413",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 058",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57419",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 059",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58997",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 060",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56749",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 062",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56755",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 063",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59369",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 064",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/58157",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 065",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59021",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 066",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59375",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 067",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59063",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 068",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59381",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 069",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59387",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 070",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59075",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 071",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59081",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 072",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59399",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 073",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59099",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 074",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59405",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 075",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59417",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 076",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56655",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 077",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57101",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 078",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59141",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 079",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59447",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 080",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59453",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 081",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59459",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 082",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59471",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 083",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59465",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 084",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56777",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 085",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56771",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 086",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59153",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 087",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59159",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 088",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56789",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 089",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59171",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 090",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59489",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 091",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59495",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 092",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56807",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 093",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56813",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 094",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56825",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 095",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56819",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 096",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56831",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 097",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56837",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 098",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56795",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 099",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59183",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 100",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59507",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 101",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56801",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 102",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56673",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 103",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59135",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 104",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56661",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 105",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59225",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 106",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56077",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 107",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56843",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 108",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59543",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 109",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56849",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 110",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59549",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 111",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56861",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 112",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56855",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 113",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59147",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 114",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59261",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 115",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56083",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 116",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56721",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 117",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59555",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 118",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59561",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 119",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56873",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 1_1986",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59733",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 120",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56733",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 121",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59297",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 122",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59303",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 123",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56879",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 124",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59309",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 125",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59321",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 126",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59339",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 127",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56089",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 128",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56667",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 129",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59357",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 130",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59585",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 131",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59573",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 132",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56891",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 133",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56897",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 134",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56761",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 135",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56903",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 136",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59597",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 137",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56909",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 138",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59393",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 139",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59429",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 140",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59441",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 141",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56915",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 142",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59603",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 143",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59609",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 144",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59615",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 145",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56783",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 146",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59501",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 147",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59513",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 148",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59177",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 149",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59525",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 150",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59621",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 151",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56921",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 152",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56927",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 153 = Grave 204",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56933",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 154",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59627",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 156",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56939",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 157",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59633",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 158",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56945",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 159",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56957",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 160",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56867",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 161",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56885",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 162",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56963",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 163",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59567",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 164",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59273",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 165",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57107",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 166",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57089",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 167",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59591",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 168",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56975",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 169",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56969",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 170",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56981",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 171",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56987",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 172",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56993",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 173",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57023",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 174",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57017",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 175",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57029",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 176",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57035",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 177",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57041",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 178",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59645",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 179",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59687",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 180",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59681",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 181",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59693",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 182",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57059",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 183",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59669",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 184",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59699",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 185",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57065",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 186",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59705",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 187",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57077",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 188",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/56951",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 189",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57083",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 190",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57095",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 193",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57119",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 194",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59725",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 195",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57113",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 196",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57005",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 197",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57011",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 198",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57047",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 199",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57053",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 200",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59675",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 201",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59717",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 202",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57071",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 203",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/59711",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 205",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57131",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 206",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57143",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 207",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57137",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 208",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57125",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 213",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57149",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 214",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/63131",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 215",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57155",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Grave 216",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/57161",
               "relationType":"crm:P46_is_composed_of" 
            },
            {
               "label":"Inhumation Cemetery",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/22378",
               "relationType":"crm:P2_has_type" 
            },
            {
               "label":"Location of Gars Thunau Obere Holzwiese",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/50510",
               "relationType":"crm:P53_has_former_or_current_location" 
            },
            {
               "label":"Thunau Obere Holzwiese",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/120859",
               "relationType":"crm:P1_is_identified_by" 
            },
            {
               "label":"2763660",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/117197",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"http://austriaca.at/8066-1inhalt?frames=yes",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/116288",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"https://doi.org/10.2307/j.ctv8xnfjn",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/116289",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Nowotny 2011",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/42406",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Nowotny 2018",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/112759",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"thunau_modified",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/112760",
               "relationType":"crm:P67_refers_to" 
            }
         ],
         "type":"Feature",
         "types":[
            {
               "hierarchy":"Evidence > Archaeology",
               "identifier":"https://thanados.openatlas.eu/api/0.1/entity/5099",
               "label":"Excavation" 
            },
            {
               "hierarchy":"Place > Burial Site > Cemetery",
               "identifier":"https://thanados.openatlas.eu/api/0.1/entity/22378",
               "label":"Inhumation Cemetery" 
            }
         ],
         "when":{
            "timespans":[
               {
                  "end":{
                     "earliest":"0950-01-01",
                     "latest":"0950-12-31" 
                  },
                  "start":{
                     "earliest":"0750-01-01",
                     "latest":"0750-12-31" 
                  }
               }
            ]
         }
      }
   ],
   "type":"FeatureCollection" 
}

Actor

Preliminary JSON-LD:

{
   "@context":"https://raw.githubusercontent.com/LinkedPasts/linked-places/master/linkedplaces-context-v1.jsonld",
   "features":[
      {
         "@id":"https://thanados.openatlas.eu/entity/11920",
         "crmClass":"crm:E40_Legal_Body",
         "description":[
            {
               "value":"In the year 779 Adalunc and his brothers Hiltipalt, Kerpalt, Anton and Otakir established the monastery of Schliersee. They build the church with the consent of bishop Arbeo who also consecrated the church.\r\nThe noble man Perhtcoz was elected as abbot and they lived under benedictinian rule." 
            }
         ],
         "geometry":{
            "geometries":[

            ],
            "type":"GeometryCollection" 
         },
         "names":[
            {
               "alias":"Slierseo cellula" 
            }
         ],
         "properties":{
            "title":"Abbey Schliersee" 
         },
         "relations":[
            {
               "label":"Location of Abbey Schliersee",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/11927",
               "relationType":"crm:P74_has_current_or_former_residence" 
            },
            {
               "label":"Slierseo cellula",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/116218",
               "relationType":"crm:P131_is_identified_by" 
            },
            {
               "label":"Arbeo consecrates the church in Schliersee",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/18524",
               "relationType":"crm:P11_had_participant" 
            },
            {
               "label":"Freising, Bishopric",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/155",
               "relationType":"crm:P107_has_current_or_former_member" 
            },
            {
               "label":"Jahn 1991",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/2120",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"TF 94 Foundation of Schliersee by Adalunc and his brothers ",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/11923",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Trad. Freising",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/117",
               "relationType":"crm:P67_refers_to" 
            }
         ],
         "type":"Feature",
         "when":{
            "timespans":[
               {
                  "end":{
                     "comment":"Secularisation in Bavaria",
                     "earliest":"1803-01-01",
                     "latest":"1803-12-31" 
                  },
                  "start":{
                     "comment":"Datation of charter",
                     "earliest":"0779-01-21",
                     "latest":"0779-01-21" 
                  }
               }
            ]
         }
      }
   ],
   "type":"FeatureCollection" 
}

Event

Preliminary JSON-LD:

{
   "@context":"https://raw.githubusercontent.com/LinkedPasts/linked-places/master/linkedplaces-context-v1.jsonld",
   "features":[
      {
         "@id":"https://thanados.openatlas.eu/entity/171",
         "crmClass":"crm:E8_Acquisition",
         "description":[
            {
               "value":"In the presence of Loius the German the property of the vineyards is confirmed to belong to Freising." 
            }
         ],
         "geometry":{
            "geometries":[

            ],
            "type":"GeometryCollection" 
         },
         "properties":{
            "title":"Vineyards Bolzano Confirmation of Property" 
         },
         "relations":[
            {
               "label":"Agilolfingian and Carolingian Eastern Alps",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/8241",
               "relationType":"crm:P2_has_type" 
            },
            {
               "label":"Bolzano Vineyards",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/130",
               "relationType":"crm:P24_transferred_title_of" 
            },
            {
               "label":"Confirmation of Property",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/179",
               "relationType":"crm:P2_has_type" 
            },
            {
               "label":"Freising, Bishopric",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/155",
               "relationType":"crm:P22_transferred_title_to" 
            },
            {
               "label":"Location of Aibling",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/136",
               "relationType":"crm:P7_took_place_at" 
            },
            {
               "label":"Quarrel Bolzano Vineyards 855",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/169",
               "relationType":"crm:P117_occurs_during" 
            },
            {
               "label":"DD LD 73 Bozen Vineyards",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/115",
               "relationType":"crm:P67_refers_to" 
            }
         ],
         "type":"Feature",
         "types":[
            {
               "hierarchy":"Case Study",
               "identifier":"https://thanados.openatlas.eu/api/0.1/entity/8241",
               "label":"Agilolfingian and Carolingian Eastern Alps" 
            },
            {
               "hierarchy":"Event",
               "identifier":"https://thanados.openatlas.eu/api/0.1/entity/179",
               "label":"Confirmation of Property" 
            }
         ],
         "when":{
            "timespans":[
               {
                  "start":{
                     "earliest":"0855-03-17",
                     "latest":"0855-03-17" 
                  }
               }
            ]
         }
      }
   ],
   "type":"FeatureCollection" 
}

Source

Preliminary JSON-LD:

{
   "@context":"https://raw.githubusercontent.com/LinkedPasts/linked-places/master/linkedplaces-context-v1.jsonld",
   "features":[
      {
         "@id":"https://thanados.openatlas.eu/entity/10435",
         "crmClass":"crm:E33_Linguistic_Object",
         "description":[
            {
               "value":"Louis the German confirms that the monastery of Niederaltaich has property in the Wachau in Aggsbach and  a Manus there, that borders on property of Freising. This property was acquired with the consent of Charlemagne at the time of the Avar wars (796) but without a written charter." 
            }
         ],
         "geometry":{
            "geometries":[

            ],
            "type":"GeometryCollection" 
         },
         "properties":{
            "title":"DD LdD #2" 
         },
         "relations":[
            {
               "label":"Aggsbach",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/10444",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Agilolfingian and Carolingian Eastern Alps",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/8241",
               "relationType":"crm:P2_has_type" 
            },
            {
               "label":"Charlemagne",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/311",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Charter2",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/40",
               "relationType":"crm:P2_has_type" 
            },
            {
               "label":"Confirmation of property at Aggsbach/Wachau for the Niederaltaich abbey",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/10436",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Freising, Bishopric",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/155",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Louis the German",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/158",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Mention of Freising Property in Aggsbach",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/10449",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Niederaltaich Abbey",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/1263",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Property near Aggsbach",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/10450",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Wachau",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/10439",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"MGH DD LD",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/114",
               "relationType":"crm:P67_refers_to" 
            }
         ],
         "type":"Feature",
         "types":[
            {
               "description":"Is named Charter2 until Ostalpen import is finished (to not get confused with Ostalpen type Charter)",
               "hierarchy":"Source",
               "identifier":"https://thanados.openatlas.eu/api/0.1/entity/40",
               "label":"Charter2" 
            },
            {
               "hierarchy":"Case Study",
               "identifier":"https://thanados.openatlas.eu/api/0.1/entity/8241",
               "label":"Agilolfingian and Carolingian Eastern Alps" 
            }
         ]
      }
   ],
   "type":"FeatureCollection" 
}

Reference

{
   "@context":"https://raw.githubusercontent.com/LinkedPasts/linked-places/master/linkedplaces-context-v1.jsonld",
   "features":[
      {
         "@id":"https://thanados.openatlas.eu/entity/36046",
         "crmClass":"crm:E31_Document",
         "description":[
            {
               "value":"Eduard Beninger, Germanenfunde des 5. Jahrhunderts von Wien XXI. Leopoldau, in: Mannus 28, 1936, 252-266." 
            }
         ],
         "geometry":{
            "geometries":[

            ],
            "type":"GeometryCollection" 
         },
         "properties":{
            "title":"Beninger, 1936" 
         },
         "relations":[
            {
               "label":"cd3f4704-f0ad-41eb-ad95-840e58b99cda",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/120856",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"irg_34650",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/39527",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"irg_34651",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/39528",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"irg_34654",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/39529",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"irg_34655",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/39530",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"irg_34657",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/40530",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"irg_34661",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/39561",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"irg_34663",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/39562",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"irg_34666",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/39563",
               "relationType":"crm:P67_refers_to" 
            },
            {
               "label":"Wien Eipeldauer Straße",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/50229",
               "relationType":"crm:P67_refers_to" 
            }
         ],
         "type":"Feature" 
      }
   ],
   "type":"FeatureCollection" 
}

Object

{
   "@context":"https://raw.githubusercontent.com/LinkedPasts/linked-places/master/linkedplaces-context-v1.jsonld",
   "features":[
      {
         "@id":"https://thanados.openatlas.eu/entity/13257",
         "crmClass":"crm:E84_Information_Carrier",
         "geometry":{
            "geometries":[

            ],
            "type":"GeometryCollection" 
         },
         "properties":{
            "title":"Codex commutationum /Cod. B" 
         },
         "relations":[
            {
               "label":"Agilolfingian and Carolingian Eastern Alps",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/8241",
               "relationType":"crm:P2_has_type" 
            },
            {
               "label":"Original Document",
               "relationTo":"https://thanados.openatlas.eu/api/0.1/entity/878",
               "relationType":"crm:P2_has_type" 
            }
         ],
         "type":"Feature",
         "types":[
            {
               "hierarchy":"Case Study",
               "identifier":"https://thanados.openatlas.eu/api/0.1/entity/8241",
               "label":"Agilolfingian and Carolingian Eastern Alps" 
            },
            {
               "hierarchy":"Information Carrier",
               "identifier":"https://thanados.openatlas.eu/api/0.1/entity/878",
               "label":"Original Document" 
            }
         ]
      }
   ],
   "type":"FeatureCollection" 
}

Localisation

Whitepaper Geometries

1. What types of physical things with locations are there according to the sources

I. Physical things like buildings, settlements, regions, areas etc. that have or originally had a position in space and a certain extend
II. Roads/routes/rivers that have or originally had a position in space and a certain extend
III. (Find-)Spots with no spatial extend that only have point coordinates.

2. Which various possibilities can be observed regarding the identification of a physical object with a spatial position/extend

case 1: The extend is known and can be drawn as a polygon that represents the extend=shape of the physical thing
E.g. the shape of a building or the area of excavation or the area of a settlement that can be drawn for example from an aerial photograph or a map.

case 2: The extend is not known but known to be within a larger area with known extend that can be drawn as a polygon.
E.g a no longer existing settlement that is known to have been situated within a known area for example in a valley between two other known settlements.

case 3: The extend is not known but known to be within a larger predefined area with known extend that is already in the database.
E.g an archeological findspot of unknown position that is known to have been situated inside the boundaries of a certain administrative unit.

case 4: The extend is not known but known to be within a larger area with unknown extend that cannot be drawn as a polygon
E.g. a no longer existing settlement that is known to have been situated within the historical boundaries of a no longer existing county.

case 5: There is no extend but only a known centerpoint
E.g. the coordinates where one find has been found.

case 6: Neither the extend nor a vague position within a reasonable larger area are known.

In many cases the exact identification of physical things/places mentioned in sources (e.g. in charters or also in archaeological publications) with one certain and still existing physcial entity and its extend is not possible. Therefore it is necessary to allow multiple possibilites to record possible locations of physical things:
A charter for example may mention one church and today two still existing churches might be identified with the one mentioned. In this case the church-entity from the source should be linked to two possible spatial objects. Here they would be two polygons, representing the extend of the respective church. However, any combination of the above mentioned cases must be technically and conceptually possible in any number. In theory it must be possible to link e.g. a castle known from a charter to the very extend of a still existing castle and at the same time to a vanished castle that is known to have been located within a certain area and also to another possible location within a certain administrative unit etc. etc.

3. User Input

Each entity with spatial position will be represented on the map at least with a marker as point. If polygon data is available these polygons will be shown too.
We want to offer the possibility to define the spatial position in any combination of the aforementioned categories. Therefore the location of the physical entity is connected 1-n to one or more entries in the gis-tables

In the map interface:

1.)
The user should be able to draw polygons to define either the extend of the physical entity or an area in which the physical thing is situated.
Also predefined categories should be chosen to define whether it is extend or area.
These polygons should be editable and deletable.
Methods: leaflet draw polygon and postgis

Form with:
Dropdown for Category selection (shape or area) -

Text field for description

2.)
The user should be able to set markers to define a point of location. In this case a point is drawn and saved to gis_centerpoints. No polygon is drawn.

4. Backend and Background Witchcraft

Postgis to/from Leaflet: see Stefan's drawshapes.js
1. get geojson from existing polygons and show them in the map.
2. Show centerpoints in Map
3. Make polygons from vertices drawn in leaflet and saves new ones and edited ones to the db
4. delete Polygons from leaflet and db

Triggers/Warnings:
5. Create/update centerpoint data automatically after polygon is drawn or edited using postgis ST_PointOnSurface

SELECT ST_AsText(ST_PointOnSurface((SELECT ST_AsText (geom) FROM openatlas.polygon WHERE WHERE id = value of id)::geometry))
insert or replace result into gis_centerpoints

6. Warnings if Point data is updated and moved outside of polygon using postgis ST_Intersects

SELECT ST_Intersects(ST_GeomFromText('POINT(value of new X, value of new Y)', 4326), (SELECT geom FROM openatlas.polygon WHERE id = value of id))
if true: all is good. if false: alert and do not allow to draw a new centerpoint.
to be extended... on the fly

5. GUI

Datainput:
offer workflow

1.
select type of localisation (see 2.)

2.
if 1 - start polygon draw-tool in map and open form (type is automatically "shape")
if 2 - start polygon draw-tool in map and open form (type can be selected from predefined categories)
if 3 - offer selection tool for administrative units
if 4 - offer selection tool for historical regions
if 5 - start markerdraw (as it is by now)

3.
after 1-3: save to db and trigger the creation of a centerpoint
after 4: if historical region has a geometry trigger the creation of a centerpoint else don't
after 5: nothing necessary

Map: use existing map Interface but remove buttons.

after one localisation is done: offer the possibility to add one more (1-n)


Developers Meeting 2019-09-19, 15:30

Participants: Stefan Eichert, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann

Location: ACDH meeting room, Vienna

Administrative

Next Versions

Frontend Update

API Concept

Miscellaneous


Developers Meeting, 2019-10-28, 15:30

Participants: Stefan Eichert, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann and special guest Rainer Simon

Location: ACDH meeting room, Vienna

Administrative

New projects

#1049 Software updates

#905 Update CIDOC CRM

#1048 Bootstrap

#1050 API

Starting with JSON resp. GeoJSON representation of OpenAtlas data using Linked places format https://github.com/LinkedPasts/linked-places
Linked Places uses JSON-LD syntax and can therefore be used as valid RDF too
Using GeoJSON-T https://github.com/kgeographer/geojson-t it can be extended by temporal attributes
"relations" in the syntax can be used to represent CIDOC-CRM mappings


Developers Meeting 2019-11-27, 15:00

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann

Location: ACDH meeting room, Vienna

Trivia

4.0.0 Version

#1048 Bootstrap

#1050 API

Notes

--> We will ask Rainer Simon about possibility to add other entities like actors or sources to the linked places format

New Tickets


Frontend Meeting - 2020-03-03, 15:30

Participants: Christoph Hoffmann, Jan Belik, Stefan Eichert, Asil Çetin, Alexander Watzinger
Location: ACDH meeting room, Vienna

This will be a hands on meeting where we implement changes on the fly. Main aim will be to get a release able Bootstrap version but of course we can also collect ideas for future improvements.

#1048 Bootstrap

Solved


Developers Meeting, 2020-05-06 15:00

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann

General

Frontend

API - Wiki


Developers Meeting, 2020-05-19 15:00

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann, Roland Filzwieser
Location: CRAWS Headquarters, Vienna

General

Recheck menu solutions of UI

API and Map interface

OpenAtlas Frontend

Finishing

Decisions


Strategic Meeting, 2020-09-28 15:30

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann
Location: ACDH-CH, Alte Burse, Vienna

Organizational

Strategic discussion

With OpenAtlas we developed a quite impressive software. Good team dynamic, pleased project partners, rising cooperation requests and positive general feedback shows that we already accomplished a lot and are going a good way. It is much more than just acquiring cooperations and implementing their requirements. We want to develop professional open source software which supports scientific projects and is pleasant to use. The purpose of this meeting is to discuss a concept for further development which is good for us and our users. To explore this we will speak about:

What do we like to work on, in which role we like to see ourselves?

Ideas for an even better OpenAtlas software

Suggestions for quality software by Alex

+ already achieved (but of course it's an ongoing effort)
~ there is room for improvement
- missing

Software

Usability

Documentation

Features


Frontend/API Meeting 2021-01-28

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann

General

Update THANADOS

Roadmap 2021

New feature requests

API Features (discuss roadmap)


Frontend/API Workshop 2021-02-17 10:00

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann

Roadmap 2021

Planning of a general Frontend and API roadmap and a CONNEC specific Frontend in the light of Leeds presence in July 2021.

We plan next workshop at end of March to check our progress and adapt the roadmap if needed.

Conceptual

Model


Meeting 2021-03-19

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann

Berni made a cool double chocolate cake to celebrate 6.0.0 release.

Discuss newest cooperation request
We like it and may be an interesting opertunity to add function bibliographical information

Internships: https://www.oeaw.ac.at/acdh/education/acdh-ch-internships
We like the idea and may try it July or August (Alex & Nina)

Image carousel for screenshots at project website
https://getbootstrap.com/docs/4.6/components/carousel/

Layout for #1457: Public notes and #1443: List view for entities missing a specific type
Done, descriptions updated

Allow characters in (value) types
Declined because it's better to keep data structured

Discuss fancy visualizations using d3.js and others
Done by Stefan and Nina

OpenAtlas Discovery
Christoph showed new presentation site proto type (OpenAtlas Discovery) and we discussed deteails.


Meeting 2021-05-10

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann

General

Issue evaluation

Questions


Meeting 2021-06-14

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschicek, Christoph Hoffmann, Andreas Olschnögger

General

Issues

IMC Leeds 2021

Frontend

API


Meeting 2021-07-08

Participants: Alexander Watzinger, Bernhard Koschiček-Krombholz, Dalibor Pančić

Kickoff meeting for testing and adapting OpenAtlas to be deployed with Kubernetes too (#1542).

General

Workflow

Outcome


Frontend/API Meeting 2021-07-27

Participants: Stefan Eichert, Nina Brundke, Alexander Watzinger, Bernhard Koschiček-Krombholz, Christoph Hoffmann, Andreas Olschnögger

Planning

API issues


Meeting API 2020-06-15, 14:00

Participants: Bernhard Koschicek, Alexander Watzinger, Stefan Eichert, Christoph Hoffmann, Nina Brundke
Location: ACDH-CH, Alte Burse, Vienna

General

API

Discussions and Brainstorming

Cleaning up tickets

Other Things

Finishing


Model and concept

CIDOC CRM and OpenAtlas
Class mapping
References
Dates


A collection of ideas that haven't made it into an own ticket yet.

Frontend

Entity view

Maps

jsTree

Forms

Manual

Settings

External References

e.g. GeoNames, Wikidata

Backend

Performance

Import

Unsorted ideas


Online Versions

Here are some OpenAtlas online versions maintained by our team.

Version Server Online Project
Demo 6.3.0 CRAWS demo.openatlas.eu
Development Demo 6.4.0 CRAWS demo-dev.openatlas.eu
THANADOS 6.4.0 ACDH-CH thanados.openatlas.eu The Anthropological and Archaeological Database of Sepultures
CONNEC 6.4.0 ACDH-CH connec.acdh.oeaw.ac.at Connected Clerics
MoByz 6.3.0 ACDH-CH mobyz.openatlas.eu Moving Byzantium
DPP 5.7.0 ARZ dppopenatlas.oeaw.ac.at Digitising Patterns of Power
Byzantine Region of Bithynia 5.7.0 ARZ fdppopenatlas.oeaw.ac.at Byzantine Region of Bithynia
History of the Serbs in Vienna 6.3.0 ARZ openatlas.orthodoxes-wien.oeaw.ac.at Historical Geoportal of Serbs in Vienna
TIB 6.3.0 ARZ tibopenatlas.oeaw.ac.at Tabula Imperii Byzantini
Geoportal der Orthodoxen 6.3.0 Berni openatlas.orthodoxes-europa.at Digitales Geoportal der Orthodoxen
MEDCON 6.3.0 CRAWS medcon.craws.net Mapping Medieval Conflict
MAMEMS 6.3.0 CRAWS mamems.openatlas.eu MAMEMS
PLAS 6.3.0 CRAWS plas.openatlas.eu PLAS
TexTech 6.3.0 CRAWS textech.openatlas.eu TexTech
Shahi 6.3.0 CRAWS shahi.openatlas.eu Shahi
COMMOVEANT 6.3.0 CRAWS commoveant.openatlas.eu Dissertation project
OpenAtlas Origins 6.4.0 CRAWS origins.openatlas.eu Instance for development
Kubernetes installation 6.3.0 ACDH-CH demo-acdh-ch.openatlas.eu Kubernetes test, work in progress

Here are some OpenAtlas prototypes for OpenAtlas Discovery, a presentation site for OpenAtlas data.

API OpenAtlas Server OpenAtlas (Backend) OpenAtlas Discovery Info
Demo 0.2.0 6.3.0 CRAWS demo.openatlas.eu frontend-demo.openatlas.eu
Development Demo 0.2.0 6.4.0 CRAWS demo-dev.openatlas.eu frontend-demo-dev.openatlas.eu
Origins 0.2.0 6.4.0 CRAWS origins.openatlas.eu frontend-origins.openatlas.eu
CONNEC 0.2.0 6.4.0 CRAWS connec.acdh.oeaw.ac.at frontend-connec.openatlas.eu

OpenAtlas and CIDOC CRM

Model import

CIDOC CRM is used as basis for the underlying data model of OpenAtlas. Currently we are using CIDOC CRM v6.2.1

The rdfs file was downloaded from http://www.cidoc-crm.org/versions-of-the-cidoc-crm

A script is used to parse the specification and import it into a PostgreSQL database (https://github.com/craws/OpenAtlas/tree/master/install)

OpenAtlas "knows" the specification and checks every link that it is made with the application. There is also a function to check all existing links which can be useful e.g. after an import of external data.

Properties

We don't import or use inverse properties (ending with i) since our links are directed anyway. Nevertheless their labels are imported for more convenient viewing of relations.

A few properties doesn't "fit" in our system because they have URLs as a domain (our system has a foreign key on domain which must match an existing class). They are:

P3, P57, P79, P80, P81, P81a, P81b, P82, P82a, P82b, P90, P168

Also some properties are linked as sub_properties_of properties with the i postfix. Since we don't use inverse properties they are linked to there counterpart without i:

P10i, P130i, P59i

OpenAtlas Model

Here you can see an already simplified version of the model used in OpenAtlas which is based on classes and properties of the CIDOC CRM.


OpenAtlas and CIDOC CRM class mapping

OpenAtlas uses the CIDOC CRM in the application but because of contextual differences we needed a more fine grained model. E.g. E33 Linguistic Object can be a source or a source translation which have different forms in different context.
Below you see a mapping between CIDOC classes and use of them in OpenAtlas.

An easy to edit mapping used in frontend is available here.
System class CIDOC Class System type (old) view name comment
acquisition E8 Acquisition event
activity E7 Activity event
actor_appellation E82 Actor Appellation
administrative_unit E53 Place type used for administrative units and historical places, empty system_type!
appellation E41 Appellation
artifact E22 Man-Made Object artifact artifact
bibliography E31 Document bibliography reference
edition E31 Document edition reference
external_reference E31 Document external reference reference
feature E18 Physical Thing feature place
file E31 Document file file
find E22 Man-Made Object find artifact
group E74 Group actor
human_remains E20 Biological Object human remains place
move E9 Move event
object_location E53 Place place location used only in combination, e.g. location of E18 or E22
person E21 Person actor
place E18 Physical Thing place place physical object in combination with a fixed location, e.g. a city, church or graveyard
reference_system E32 Authority Document
source E33 Linguistic Object source content source
stratigraphic_unit E18 Physical Thing stratigraphic unit place
source_translation E33 Linguistic Object source translation source_translation
type E55 Type type
E84 Information Carrier information carrier object merged with artifact
E40 Legal Body actor merged with group

History


Project meetings

2021-07-27 Frontend/API meeting

2021

2021-07-08 Kubernetes meeting
2021-06-14 Developers meeting
2021-05-10 Developers meeting
2021-03-19 Hackathon Retreat
2021-02-17 Frontend/API workshop
2021-01-28 Frontend/API meeting

2020

2020-09-28 Strategic meeting
2020-09-08 API meets Frontend
2020-06-17 Hackathon
2020-06-15 API meeting
2020-05-19 Frontend meeting
2020-05-06 Developers meeting
2020-03-03 Frontend meeting

2019

2019-11-27 Developers meeting
2019-10-28 Developers meeting
2019-09-19 Developers meeting


Some settings when using PyCharm IDE

Editor -> General

Remove trailing spaces on: All lines
Ensure every saved file ends with a line break = Checked

Editor -> Code Style

Set hardwrap to 80 columns

Editor -> Code Style -> Python -> Tab Imports

Nosetests

Target: Choose Script path and enter path to tests, e.g. /home/alex/projects/www/openatlas/tests
Additional Arguments: --with-coverage --cover-package openatlas --cover-html --cover-tests --cover-erase

Preferences

These are some personal preferences which don't have any effect on submitted code.

Font


References

OpenAtlas uses P67 ("refers to") in order to link various entities to references.
These can be:

In order to record which part of the document contains the respective reference a delimiter respectively a certain value to determine the position in the reference, is stored along with the link between the entities. This can be page numbers of a book, chapters, figure numbers etc.

E.g.: E31 Document "Book of Kells" - P67 "refers to" - E21 Person "Saint Mary" at delimiter: "Folio 7v" 

Each reference document is more or less unique and can refer to multiple entities. The distinction is defined by the delimiter value. If the document as a whole refers to the entity, no delimiter is necessary.

Reference systems

e.g. vocabularies, gazetteers like GeoNames, Wikidata etc.

The link between an entity and the Authority Document would be stored in the model.link table in the following way

This combination of E32 and delimiter could furthermore be resolved as E31 "Document" as it is a unique reference documenting the entity while the E32 alone is the container for all possible references from this authority document.
E21 Person "Terry Prattchet" - is refererred to by (P67) - E31 document (https://www.wikidata.org/wiki/Q46248) - P71 is listed in - E32 Authority Document (https://www.wikidata.org/wiki/)

References and files

Various entities can be connected to files. This is mapped as E31 (Document = file) refers to (P67) -> E1. In our case files can refer to any of the "top level" entitites.
Files can (but need not necessarily) be images. Files are stored with a certain system type (i.e. file). If the file is an image, this is most probably a depiction of the entity.

A file can also have a further reference. E.g. the source where the file comes from. This is for example the bibliographical reference to the publication where a file (e.g. a scanned image) is extracted from. In this case there is a link between a document E31 with a type "Bibliography" (or subtype) via P67 to another document E31 with a system type "file". In this case the file is not the depiction of the reference but the reference is the origin of the file. This is mostly needed to document the copyright resp. right holder or source of the file.


Release workflow

Pre release

Release

Post release

Linguist

github-linguist --breakdown

Sites-example

 Settlement:
    permanent Settlement
      awan (Stadt, Dorf, Siedlungsplatz)
      selište – селиште, селище (Plansiedlung)
      selište – селиште, селище (Wüstung)
      rural Settlement:
         Dorf
             gewł, geoł (Dorf)
             gewłak´ałak´ (befestigtes Dorf/Siedlung),
             selo – село (Dorf)
             villa, ad XY (Dorf, Siedlung)
             villula, locus, (kleines Dorf)
             castrum (befestigtes Dorf)
         Weiler
             zaselĭkĭ – заселькь (Weiler)
         Gehöft
             agarak (Gehöft, Landgut)
             curtis (Gehöft, Landgut)
             gawit´ (Hof), 
             dastakert (Landgut, Besitztum)
             manus/a/um, colonius/a (Abhängige Hofstelle)
             Casa, Domus, Aedificium (Haus als Teil eines Besitzes)

      urban settlement   
         gradŭ – градъ (Stadt, Oberstadt)
         mayrak´ałak´ (Mutterstadt, Metropolis) 
         befestigte Stadt: k´ałak´ (befestige Stadt)
         urbs, oppidum, civitas (Stadt)

    temporary Settlement:
        Refugium
        comitatus (mobiler Hof des Königs)
        Feldlager
            banak (Feldlager)
        Saisonale Sieldung
            katunŭ – катоунъ (temporäre nomadische Siedlung) 
            Alm

 Military Facility: 
    amroc´ (Festung, Befestigung), 
    berd (Festung, Burg), 
    mijnaberd (Zitadelle, Akropolis)
    gradŭ – градъ (Festung, Burg)
    castrum (Burg, mehrfache Bedeutung d. Wortes)
    Clusura, Claustra, Clusa (Talsperre)

                , 

 Ritual Site
     Church: 
       ekełeci (Kirche), 
       martyrium, vkayanoc´ (Kirche eines Apostels o. wichtigen Märtyrers)
       crĭkva – црьква (Kirche)
       crŭkŭvište – цръкъвиште (verfallene Kirche)
       basilica (tolle Kirche)
       ecclesia (Kirche)
       parva ecclesia (kleine Kirche)
     Monastery: 
       vank´ (Kloster), 
       mainjin (Eremitage, Gemeinschaft von Eremiten, „Laura“), 
       kusastan (Frauenkloster)
       manastyrĭ – манастъірь (Kloster)
       metohŭ – метохъ; metohija – метохиꙗ (Metochion)
       Monasterium (Kloster)
       monasterium puellarum (Frauenkloster)
       cella, cellula (kleines Kloster)
     See of Bishopric: 
       kat´ołikē (Kathedrale, Hauptkirche)
     Mosque
     Temple: 
       atrušan (Feuertempel, Zoroastrismus), 
       bagin (heidnischer Altar oder Schrein), 
       mehean (Mithrastempel, heidnischer Schrein)
     Synagogue

 Burial Site
     Cemetery
        Inhumation Cemetery
        Biritual Cemetery
        Cremation Cemetery
     Churchyard

 Infrastructure
     Traffic
        Watercrossing
           Ford
             Ferry
           Bridge
        Landing Places
        Way
           Main Way
           Sideway
        Pass
        Stationen
           Abgabestation (Miete für Tretboot/Maut/Zoll...)
           Raststation
           Hospitium

 Economic Site
     Agricultural Site
       Acker
       Weide
          Sommerweide
          Winterweide
       Gärten
          Weingarten
       Forst
       Fischrevier
       Jagdrevier

         partēz, draχt (Garten, Obstgarten), 
         mazri, p´ayt (Wald, Holz), 
         ang, art (Feld)
         Meadows: carak (Weide)
         Vineyard: gini, aygestan, aygi (Wein, Weingarten)
         planina – планина (Sommerweide)
         zimovište – зимовиште (Winterweide)
         paša, pašište – паша, пашиште (Weide, Weideland)
         zabělĭ – забѣль (Weide, Hain)
         niva – нива (Acker)
         kupljenica – коуплѥница (gekaufter Acker)
         polje – полѥ (Feld)
         vinogradŭ – виноградъ (Weinberg, Weingarten)
         alpis, alpestris (Alm)
         agrum, XX hobas de terra arabili (Acker)
         pratum, pascua, campus (Wiese, Weideland)
         silva (Wald/weide)
         vineum (Weingarten => Symbol of Power)
         piscatio (Fischereirecht)
         venatio (Jagdrecht => Symbol of Power)

     Industrial Site
         Rohstoffgewinnung 
           Salz
              Salz: ałtk (Salzlager), 
              ad sal coquendum, patella, glago (Salzkochstelle)
           Metall
              Eisengewinnung
                 Erz: erkat´ (Eisen); 
                 aruzi (Erz)
              Kupfergewinnung
              Weißmetallgewinnung
              Edelmetall
                 arčat (Silber, Gold), 
         Verarbeitung/Produktion
            Mühle         
              voděnica – водѣница (Wassermühle)
            Schmiede

     Trading Sites
        Markt  
          Market: vačar (Markt); 
          trŭgŭ – тръгъ (Marktplatz, Markt)
          panagjurŭ – панагюръ (Jahrmarkt)
          forum, emporium (Markt)           

  Boundary Mark
    Grenzpunkt
    Grenzlinie
    Grenzstreifen
    Grenzraum

      (genau bezeichnete Grenzpunkte wie zB Bäume, Flusseinmündungen etc.) 
      termina, fines (Grenzraum)
      comitatus, marca (Grenzherrschaft)
      kraište – краиште (Grenzregion, Militärgrenze, Grenze)

  Topographical Entities
         Waterbody
           Lake
           River
           Sea
           Swamp
         Mountain
           gora – гора; brŭdo – бръдо (Berg)
           mons, montes (Berg, Gebirge)
         collis (Hügel)
         Valley
         Forest
           Urwald? 


Below are some unsorted database related code snippets used in development.

Exports

Database Structure

Export the database structure from the test database (used to avoid specialties in production databases) into install/1_structure.sql

pg_dump -sc --if-exists -n model -n gis -n log -n web -n import openatlas_test > install/1_structure.sql

Model Data

pg_dump openatlas --inserts -a -t model.class -t model.class_i18n -t model.class_inheritance -t model.property -t model.property_i18n -t model.property_inheritance > install/3_data_model.sql

Single Schema

pg_dump -n web openatlas > /tmp/openatlas_web.sql
pg_dump -n model openatlas > /tmp/openatlas_web.sql

Add update trigger for modified field

Replace schema.table and execute:

CREATE TRIGGER update_modified BEFORE UPDATE ON schema.table FOR EACH ROW EXECUTE PROCEDURE model.update_modified();

Export database for Windows

pg_dump -Fc openatlas > openatlas.dump

to ingest in windows

C:\Program Files\PostgreSQL\12\bin\pg_restore.exe --host "localhost" --port "5432" --username "postgres" --no-password --dbname "openatlas" --clean --verbose "path to dump file" 

Reset Demo

/var/lib/postgresql/reset_demo.sh

Find used but missing places

e.g. after a case study separation (not sure if this statement is now showing really missing or just needed locations)

SELECT e.id, e.name, e.system_type FROM model.entity e
WHERE e.class_code = 'E53' AND e.system_type = 'place location' AND e.id IN (
   SELECT r.id FROM model.link lr JOIN model.entity r ON lr.range_id = r.id AND lr.property_code IN ('P74', 'OA8', 'OA9', 'P7'))
   AND e.id NOT IN (SELECT range_id FROM model.link WHERE property_code = 'P53');

Delete orphaned locations

DELETE FROM model.entity WHERE id IN (
    SELECT id FROM model.entity WHERE system_type = 'place location' AND id NOT IN (
        SELECT e.id FROM model.entity e JOIN model.link l ON e.id = l.range_id AND l.property_code = 'P53' 
        WHERE e.class_code = 'E53' AND e.system_type = 'place location'));

Import database to Windows

Make a dump with inserts

pg_dump --attribute-inserts openatlas > openatlas.sql

In the pgadmin tool, select the corresponding database, run the query tool and select the open file option.
Load the provided dump file and execute (F5) it.
Login and adapt user as needed.

Recursive Events

To get all child events of a given event the SQL below (replace ROOT_EVENT_ID at bottom). It works but is slow and could be improved.

WITH RECURSIVE tree AS (
  SELECT e.id, ARRAY[]::INTEGER[] AS ancestors
  FROM model.entity e
  WHERE (SELECT s.id FROM model.entity s JOIN model.link l ON s.id = l.range_id AND l.domain_id = e.id AND l.property_id = (SELECT id FROM model.property WHERE code = 'P117')) IS NULL 
  UNION ALL 
  SELECT e.id, tree.ancestors || 
    (SELECT s.id FROM model.entity s JOIN model.link l ON s.id = l.range_id AND l.domain_id = e.id AND l.property_id = (SELECT id FROM model.property WHERE code = 'P117'))
  FROM model.entity e, tree
  WHERE (SELECT s.id FROM model.entity s JOIN model.link l ON s.id = l.range_id AND l.domain_id = e.id AND l.property_id = (SELECT id FROM model.property WHERE code = 'P117')) = tree.id
)
SELECT * FROM tree WHERE ROOT_EVENT_ID = ANY(tree.ancestors);


Source workflow

#1064 In conception phase, draft by Stefan:

Due to the increasing complexity and additional features regarding written sources and their interconnections we need to reorganise the respective UI.
It should be easy to distinguish between:

Core

  1. Content: Source Content (summary of the content), Source Translation, Source Transliteration on one hand and further linked entities like the
  2. Information Carrier (physical object like the letter, paper, papyrus etc.)
  3. References bibliographic references (e.g. Edition of the charter, further bibliography) and external references

Entities referred to by the content

  1. Actors mentioned in the content
  2. Places mentioned in the content
  3. Events mentioned in the content

Entities involved in creation of the source

  1. Creators/writers/involved actors of the information carrier
  2. Place of creation
  3. Date of creation

Linking between event entities from the content

  1. Activity including location where it took place and involved actors along with dates
  2. Acquisition including place/property that changed ownership along with new and old owner plus dates

Further links

  1. Move of information carrier/physical object in case of e.g. letter exchange along with date and start/end location

Whitepaper Geometries

Demo: http://homepage.univie.ac.at/stefan.eichert/shapedraw/

1. What types of physical things with locations are there according to the sources

I. Physical things like buildings, settlements, regions, areas etc. that have or originally had a position in space and a certain extend
II. Roads/routes/rivers that have or originally had a position in space and a certain extend
III. (Find-)Spots with no spatial extend that only have point coordinates.

2. Which various possibilities can be observed regarding the identification of a physical object with a spatial position/extend

case 1: The extend is known and can be drawn as a polygon that represents the extend=shape of the physical thing
E.g. the shape of a building or the area of excavation or the area of a settlement that can be drawn for example from an aerial photograph or a map.

case 2: The extend is not known but known to be within a larger area with known extend that can be drawn as a polygon.
E.g a no longer existing settlement that is known to have been situated within a known area for example in a valley between two other known settlements.

case 3: The extend is not known but known to be within a larger predefined area with known extend that is already in the database.
E.g an archeological findspot of unknown position that is known to have been situated inside the boundaries of a certain administrative unit.

case 4: The extend is not known but known to be within a larger area with unknown extend that cannot be drawn as a polygon
E.g. a no longer existing settlement that is known to have been situated within the historical boundaries of a no longer existing county.

case 5: There is no extend but only a known centerpoint
E.g. the coordinates where one find has been found.

case 6: Neither the extend nor a vague position within a reasonable larger area are known.

In many cases the exact identification of physical things/places mentioned in sources (e.g. in charters or also in archaeological publications) with one certain and still existing physcial entity and its extend is not possible. Therefore it is necessary to allow multiple possibilites to record possible locations of physical things:
A charter for example may mention one church and today two still existing churches might be identified with the one mentioned. In this case the church-entity from the source should be linked to two possible spatial objects. Here they would be two polygons, representing the extend of the respective church. However, any combination of the above mentioned cases must be technically and conceptually possible in any number. In theory it must be possible to link e.g. a castle known from a charter to the very extend of a still existing castle and at the same time to a vanished castle that is known to have been located within a certain area and also to another possible location within a certain administrative unit etc. etc.

3. User Input

Each entity with spatial position will be represented on the map at least with a marker as point. If polygon data is available these polygons will be shown too.
We want to offer the possibility to define the spatial position in any combination of the aforementioned categories. Therefore the location of the physical entity is connected 1-n to one or more entries in the gis-tables

In the map interface:

1.)
The user should be able to draw polygons or points to define either the extend of the physical entity or an area in which the physical thing is situated.
Also predefined categories should be chosen to define whether it is extend or area.
These polygons should be editable and deletable.
Methods: leaflet draw polygon and postgis

2.)
The user should be able to define an already existing area in which the site is located
2a) Administrative Unit: with known extend
2b) Historical Region: with unknown extend

3.)
The user should be able to set markers to define a point of location. In this case a point is drawn and saved to gis_centerpoints. No polygon is drawn.

4. Backend and Background Witchcraft

Postgis to/from Leaflet: see Stefan's drawshapes.js
1. get geojson from existing polygons and show them in the map.
2. Show centerpoints in Map
3. Make polygons from vertices drawn in leaflet and saves new ones and edited ones to the db
4. delete Polygons from leaflet and db

Triggers/Warnings:
5. Create/update centerpoint data automatically after polygon is drawn or edited using postgis ST_PointOnSurface

SELECT ST_AsText(ST_PointOnSurface((SELECT ST_AsText (geom) FROM openatlas.polygon WHERE WHERE id = value of id)::geometry))
insert or replace result into gis_centerpoints

6. Warnings if Point data is updated and moved outside of polygon using postgis ST_Intersects

SELECT ST_Intersects(ST_GeomFromText('POINT(value of new X, value of new Y)', 4326), (SELECT geom FROM openatlas.polygon WHERE id = value of id))
if true: all is good. if false: alert and do not allow to draw a new centerpoint.

to be extended... on the fly

5. GUI

Model: https://mapfig.org/map/

Datainput:
offer workflow
After new Site form is filled: offer button for localisation (next to save).
If pushed: save site and open Map-Tab

1.
select type of localisation (see 2.)

2.
if 1 - start polygon draw-tool in map and open form (type is automatically "shape")
if 2 - start polygon draw-tool in map and open form (type is automatically "area")
if 3 - offer selection tool for administrative units
if 4 - offer selection tool for historical regions
https://www.jstree.com/ for 3 and 4
if 5 - start markerdraw (as it is by now)

3.
after 1-3: save to db and trigger the creation of a centerpoint
after 4: if historical region has a geometry trigger the creation of a centerpoint else don't
after 5: nothing necessary

Map: use existing map Interface but remove buttons.

after one localisation is done: offer the possibility to add one more (1-n)


Sphinx

Sphinx is used to generate the in-application manual. The content of the manual can be changed in the .rst (Restructured text) files at sphinx/source.

Install Sphinx

apt install python3-sphinx python3-sphinx-rtd-theme

Edit manual

Changes are made in the .rst files at sphinx/source

Generate documentation

After editing the HTML sites have to be generated. To avoid merge conflicts please make changes only in the develop branch and push it afterwards.

sphinx-build ./sphinx/source/ openatlas/static/manual

After finishing changes it is a good practice to delete the openatlas/static/manual directory and generate the whole manual again. Otherwise sometimes not all changes (e.g. menu structure) may be propagated correctly.


OpenAtlas is developed with some standards in mind.

Open Source

Only open source libraries (e.g. jQuery) and open source software requirements (e.g. a PostgreSQL database) are used.
All non-code files should be open data, e.g. like the logo with CC BY-SA 4.0.
This guaranties that the application can be shared as open source (GPL 2) e.g. on GitHub.

If 3rd party software or media is used it is important to:

Python

Tests

Python code should be covered by tests with assertions. We aim for 100% code coverage although some parts (e.g. mail functions) may be excluded with the # pragma: no cover option.

Mypy

Mypy is an optional static type checker for Python that aims to combine the benefits of dynamic (or "duck") typing and static typing. Available as plugin for PyCharm where we use it with

--ignore-missing-imports --allow-untyped-decorators --no-warn-return-any --strict

PEP8

We are using PEP 8 Style Guide for Python Code. Available as plugin for PyCharm.

HTML

We are using HTML 5 and the site should be validating correctly.
Exceptions may be acceptable if (harmless) non valid HTML 5 is produced by 3rd party libraries.

Bugs

Of course we do our best to avoid them in the first place but if bugs in already released versions get apparent they always have the highest priority.


Note: this information is outdated, some new types are missing.

System types can be extended but not renamed or deleted. They are displayed in overview lists.

If a form is extendable it will be possible to add custom types. System types are single select only (E55 linked with P2).

Form Domain Extendable System Types
Actor Actor Relation OA7 Actor Actor Relation (directed)
Bibliography E31 yes Bibliography
Edition E31 yes Edition
Event E6,E7,E8,E12 yes Event
Group E74 yes
Information Carrier E84 yes Information Carrier
Involvement P11 Involvement
Legal Body E40 yes
Member P107 Actor Function
Person E21 yes
Place E18, E53 yes Place
Administrative Unit*
Historical Place*
Source E33 yes Source
* Administrative Unit and Historical Place are not types but locations (E53) which can be linked with P89 to the location (E53) of a physical thing (E18). Multiple selection is possible.

To do

h2 Sex Estimation


To do

Sex estimation


Translations

The user interface was designed with internationalization and localization in mind. Labels and texts are stored in language specific gettext files located in openatlas/translations.

These files can be created or edited with e.g. Poedit even by "non programmers".

At the moment translations for English and German are available but can easily be extended if translations for other languages are available.

Update existing translations:

pybabel extract -F openatlas/translations/babel.cfg -k lazy_gettext -o openatlas/translations/messages.pot .
pybabel update -i openatlas/translations/messages.pot -d openatlas/translations

When translating the first time - WARNING existing translations get deleted!:

pybabel extract -F openatlas/translations/babel.cfg -k lazy_gettext -o openatlas/translations/messages.pot .
pybabel init -i openatlas/translations/messages.pot -d openatlas/translations -l de

Usage

This site explains the different usage scenarios. The API basically can be accessed through two methods: Either from the user interface of an OpenAtlas application or, if the settings will allow it, from another application.

Please refer to the SwaggerHub documentation: https://app.swaggerhub.com/apis-docs/ctot-nondef/OpenAtlas/0.2

Paths

Limited parameters available:

All Parameters available:

Parameter

The API paths also take in parameters.

path\parameter sort column limit filter first last show count download lang
entity x x
entity/download x
node_entities x x
node_entities_all x x
subunit x x
subunit_hierarchy x x
content x x
display
code x x x x x x x x x
class x x x x x x x x x
latest x x x
query x x x x x x x x x

Sort

<'asc', 'desc'>

The sort parameter controls the order of the results. These can be either ascending (asc) or descending (desc). To use this feature add the parameter:
?sort=<'asc','desc'>

Validation

If multiple sort parameter are used, the first valid sort input will be used.
It does not matter if the words are uppercase or lowercase (i.e. DeSc or aSC), but the query only takes asc or desc as valid input. If no valid input is provided, the result is orders ASC.

Column

<'id', 'class_code', 'name', 'description', 'created', 'modified', 'system_type', 'begin_from', 'begin_to', 'end_from', 'end_to'>

The column parameter declares which columns in the table are sorted with the sort parameter.

?column=<'id', 'class_code', 'name', 'description', 'created', 'modified', 'system_type', 'begin_from', 'begin_to', 'end_from', 'end_to'>

Validation

If multiple column parameter are used, a list is created, by the order in which the parameters are given (i.e. ?column=name&column=description&column=id will order by name, description and id).
It does not matter if the words are uppercase or lowercase (i.e. Name, ID, DeScrIPtioN or Class_Code). If no valid input is provided, the results are ordered by name.

Limit

<number>

The limit parameter declares how many results will returned.

?limit=<number>

Validation

If multiple limit parameter are used, the first valid limit input will be used. Limit only take positive numbers.

Filtering

<=, !=, <, <=, >, >=, LIKE, IN, AND, OR, AND NOT, OR NOT>

The filter parameter is used to specify which entries should return.

?filter=<XXX>

Validation

Filter takes a lot of different parameters in various forms. Filter values need to be separated by |.
  1. First value has to be a concatenation operator: 'and': 'AND', 'or': 'OR', 'onot': 'OR NOT', 'anot': 'AND NOT'.
  2. Second value has to be the effected column: 'id', 'class_code', 'name', 'description', 'created', 'modified', 'system_type', 'begin_from', 'begin_to', 'end_from', 'end_to'.
  3. Third value has to be a logical operator: 'eq': '=', 'ne': '!=', 'lt': '<', 'le': '<=', 'gt': '>', 'ge': '>=', 'like': 'LIKE',
  4. Fourth value has to be the search term. If the 'in' operator is selected, then the search term has to be in brackets and separated by commas.

Please note, that the filter values will translate directly in SQL. For example:

?filter=and|name|like|Ach&filter=or|id|gt|5432

will result in
AND e.name LIKE %%Ach%% OR e.id > 5432

?filter=or|id|gt|150&filter=anot|id|ne|200 
?filter=and|name|like|Ach

Pagination

first=<id> OR last=<id> 

The first parameter takes ids and will show every entity after and including the named id.
The last parameter takes ids and will show every entity after the named id.

?first=<id>

?last=<id>

Validation

First and last take only one id, which is has to be a number. The table will be sorted AND filtered before the pagination comes in place.

?last=220
?first=219

Show/Hide Types

<'when', 'types', 'relations', 'names', 'links', 'geometry', 'depictions', 'none'>

The show parameter will take in the key values of a json. If no value is given, every key will be filled. If a value is given, it only will show the types which are committed. If the parameter contains none, no additional keys/values will be shown

?show=<'when', 'types', 'relations', 'names', 'links', 'geometry', 'depictions', 'none'>

Validation

For each value a new parameter has to be set. The value will be matched against a list of keywords, so wrong input will be ignored.

?show=when
?show=types
?show=types&show=when
?show=none

Count

<>

Returns a json with a number of the total count of the included entities.

?count

Validation

Only count will trigger the function. Count can have any numbers assigned to it, which makes no difference.

?count

Download

<>

Will trigger the download of the result of the request path.

?download

Validation

Only download will trigger the function. Download can have anything assigned to it, but this will be discarded.

?download

Lang (Language)

<'en', 'de'>

Only works with the /api/0.1/content path. Select the language, which content will be displayed.

?lang

Validation

Default value is None, which means the default language of the OpenAtlas instance is taken.

?lang
?lang=en
?lang=DE

Documentation

Welcome to the Wiki and issue tracker of OpenAtlas. Feel free to contact us at openatlas@oeaw.ac.at.

Workflow

OpenAtlas is extended continuously. To keep it viable we agree on workflows and standards.

Tools

Notes

Ideas, drafts and concepts

Archive