view graphconvert.py @ 45:e53a1bc87f99

cleanup and some fixes to starred event graph
author drewp@bigasterisk.com
date Thu, 06 Jun 2024 15:57:26 -0700
parents b5d3d9a8c83d
children f2dd88b9964c
line wrap: on
line source

from dateutil.tz import tzlocal
from rdflib import RDF, RDFS, ConjunctiveGraph, Literal, Namespace, URIRef

from localtypes import Conf, feedFromCalId

EV = Namespace("http://bigasterisk.com/event#")


def asGraph(conf: Conf, cals, events, extraClasses=[], ctxUri: URIRef = EV['gcalendar']):
    ctx = ConjunctiveGraph(identifier=ctxUri)
    graph = ConjunctiveGraph()
    graph.namespace_manager.bind('ev', EV)

    for doc in cals:
        feed = URIRef(feedFromCalId(conf, doc['_id']))
        graph.add((feed, RDF.type, EV['CalendarFeed'], ctx))
        if doc['summary']:
            graph.add((feed, RDFS.label, Literal(doc['summary'].strip()), ctx))
        if doc['description']:
            graph.add((feed, EV['description'], Literal(doc['description'].strip()), ctx))

    for ev in events:
        uri = URIRef(ev.get('uri', ev.get('_id')))
        if uri is None:
            raise ValueError(f"{ev=} had no event uri")

        def add(p: URIRef, o: URIRef | Literal):
            return graph.add((uri, p, o, ctx))

        add(RDF.type, EV['Event'])
        for cls in extraClasses:
            add(RDF.type, cls)
        add(EV['title'], Literal(ev['title']))
        add(EV['start'], Literal(ev['start']))
        add(EV['startDate'], Literal(ev['startDate']))
        add(EV['end'], Literal(ev['end']))
        add(EV['feed'], URIRef(ev['feed']))
        # graph.add((feed, RDFS.label, Literal(ev['feedTitle'])))
        if 'htmlLink' in ev:
            add(EV['htmlLink'], URIRef(ev['htmlLink']))
    return graph


def asJsonLd(events) -> dict:
    ret: dict = {'@graph': []}
    for ev in events:
        ev['startTime'] = ev['startTime'].astimezone(tzlocal()).isoformat()
        ev['endTime'] = ev['endTime'].astimezone(tzlocal()).isoformat()
        ev['@id'] = ev.pop('uri')
        ret['@graph'].append(ev)

    ret['@context'] = {
        "xsd": "http://www.w3.org/2001/XMLSchema#",
        "ev": "http://bigasterisk.com/event#",
        "startTime": {
            "@id": "ev:startTime",
            "@type": "xsd:dateTime"
        },
        "endTime": {
            "@id": "ev:endTime",
            "@type": "xsd:dateTime"
        },
        "startDate": {
            "@id": "ev:startDate",
            "@type": "xsd:date"
        },
        "endDate": {
            "@id": "ev:endDate",
            "@type": "xsd:date"
        },
        "title": "ev:title",
        "feed": {
            "@id": "ev:feed",
            "@type": "@id"
        },
        "htmlLink": {
            "@id": "ev:htmlLink",
            "@type": "@id"
        },
    }
    return ret