def base_uri(xc, p, contextItem, args): item = anytypeArg(xc, args, 0, "node()?", missingArgFallback=contextItem) if item == (): return '' if isinstance(item, (ModelObject, ModelDocument)): return UrlUtil.ensureUrl(item.modelDocument.uri) return ''
def insertFiling(self, rssItem, g): self.showStatus("insert filing") # accession graph -> document vertices new_filing = {'documents': []} if self.modelXbrl.modelDocument.creationSoftwareComment: new_filing['creation_software'] = self.modelXbrl.modelDocument.creationSoftwareComment datetimeNow = datetime.datetime.now() datetimeNowStr = XmlUtil.dateunionValue(datetimeNow) entryUri = modelObjectDocumentUri(self.modelXbrl) if rssItem is not None: # sec accession # set self. new_filing['filingType'] = "SEC filing" # for an RSS Feed entry from SEC, use rss item's accession information new_filing['filingNumber'] = filingNumber = rssItem.accessionNumber new_filing['acceptedTimestamp'] = XmlUtil.dateunionValue(rssItem.acceptanceDatetime) new_filing['filingDate'] = XmlUtil.dateunionValue(rssItem.filingDate) new_filing['entityId'] = rssItem.cikNumber new_filing['entityName'] = rssItem.companyName new_filing['SICCode'] = rssItem.assignedSic new_filing['SECHtmlUrl'] = rssItem.htmlUrl new_filing['entryUrl'] = rssItem.url self.filingURI = rssItem.htmlUrl else: # not an RSS Feed item, make up our own accession ID (the time in seconds of epoch) intNow = int(time.time()) new_filing['filingNumber'] = filingNumber = str(intNow) self.filingId = int(time.time()) # only available if entered from an SEC filing new_filing['filingType'] = "independent filing" new_filing['acceptedTimestamp'] = datetimeNowStr new_filing['filingDate'] = datetimeNowStr new_filing['entryUrl'] = UrlUtil.ensureUrl(self.modelXbrl.fileSource.url) self.filingURI = filingNumber g[FILINGS][self.filingURI] = new_filing self.filing = new_filing # for now only one report per filing (but SEC may have multiple in future, such as form SD) self.reportURI = modelObjectDocumentUri(self.modelXbrl) self.report = {'filing': self.filingURI, 'aspectProxies': {}, 'relationshipSets': {}, 'dataPoints': {}, 'messages': {}} new_filing['reports'] = {self.reportURI: self.report} # relationshipSets are a dts property self.relationshipSets = [(arcrole, ELR, linkqname, arcqname) for arcrole, ELR, linkqname, arcqname in self.modelXbrl.baseSets.keys() if ELR and (arcrole.startswith("XBRL-") or (linkqname and arcqname))]
def identifyPreexistingDocuments(self): self.existingDocumentUris = set() if not self.isJsonFile: docFilters = [] for modelDocument in self.modelXbrl.urlDocs.values(): if modelDocument.type == Type.SCHEMA: docFilters.append('STR(?doc) = "{}"'.format(UrlUtil.ensureUrl(modelDocument.uri))) results = self.execute( # TBD: fix up for Mongo DB query "select", query=""" PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX DTS: <http://xbrl.org/2013/rdf/DTS/> SELECT distinct ?doc WHERE { ?doc rdf:type DTS:Document FILTER( """ + '\n|| '.join(docFilters) + ") .}") try: for result in results['results']['bindings']: doc = result['doc'] if doc.get('type') == 'uri': self.existingDocumentUris.add(doc['value']) except KeyError: pass # no existingDocumentUris
def modelObjectDocumentUri(modelObject): return UrlUtil.ensureUrl(modelObject.modelDocument.uri)