def set_target(self, snak, value): if value in ('somevalue', 'novalue'): snak.setSnakType(value) return True if snak.type == 'wikibase-item': snak.setTarget(pywikibot.ItemPage(self.repo, value)) return True elif snak.type == 'wikibase-property': snak.setTarget(pywikibot.PropertyPage(self.repo, value)) return True elif snak.type == 'quantity': match = self.quantityR.fullmatch(value) if match: amount, error, unit = match.groups() else: match = self.quantity_oldR.fullmatch(value) if match: amount, lower, upper, unit = match.groups() error = upper, lower # it *is* the other way around if match: if unit: unit = pywikibot.ItemPage(self.repo, 'Q' + unit) quantity = WbQuantity(amount, unit, error, site=self.repo) snak.setTarget(quantity) return True elif snak.type == 'time': iso, _, prec = value.rpartition('/') if iso: time = WbTime.fromTimestr(iso, precision=int(prec), site=self.repo) snak.setTarget(time) return True elif snak.type in ('string', 'external-id', 'url', 'math'): if value.startswith('"') and value.endswith('"'): snak.setTarget(value[1:-1]) return True elif snak.type == 'commonsMedia': if value.startswith('"') and value.endswith('"'): repo = self.repo.image_repository() snak.setTarget(pywikibot.FilePage(repo, value[1:-1])) return True #elif snak.type in ('geo-shape', 'tabular-data'): elif snak.type == 'monolingualtext': lang, _, text = value.partition(':') if text and text.startswith('"') and text.endswith('"'): monotext = WbMonolingualText(text[1:-1], lang) snak.setTarget(monotext) return True elif snak.type == 'globe-coordinate': match = self.globeR.fullmatch(value) if match: coord = Coordinate(*map(float, match.groups()), site=self.repo) snak.setTarget(coord) return True return False
def set_target(self, snak, value): if value in ('somevalue', 'novalue'): snak.setSnakType(value) return True if snak.type == 'wikibase-item': snak.setTarget(pywikibot.ItemPage(self.repo, value)) return True elif snak.type == 'wikibase-property': snak.setTarget(pywikibot.PropertyPage(self.repo, value)) return True elif snak.type == 'quantity': match = self.quantityR.fullmatch(value) if match: amount, error, unit = match.groups() else: match = self.quantity_oldR.fullmatch(value) if match: amount, lower, upper, unit = match.groups() error = upper, lower # it *is* the other way around if match: if unit: unit = pywikibot.ItemPage(self.repo, 'Q' + unit) quantity = WbQuantity(amount, unit, error, site=self.repo) snak.setTarget(quantity) return True elif snak.type == 'time': iso, _, prec = value.rpartition('/') if iso: time = WbTime.fromTimestr( iso, precision=int(prec), site=self.repo) snak.setTarget(time) return True elif snak.type in ('string', 'external-id', 'url', 'math'): if value.startswith('"') and value.endswith('"'): snak.setTarget(value[1:-1]) return True elif snak.type == 'commonsMedia': if value.startswith('"') and value.endswith('"'): repo = self.repo.image_repository() snak.setTarget(pywikibot.FilePage(repo, value[1:-1])) return True #elif snak.type in ('geo-shape', 'tabular-data'): elif snak.type == 'monolingualtext': lang, _, text = value.partition(':') if text and text.startswith('"') and text.endswith('"'): monotext = WbMonolingualText(text[1:-1], lang) snak.setTarget(monotext) return True elif snak.type == 'globe-coordinate': match = self.globeR.fullmatch(value) if match: coord = Coordinate(*map(float, match.groups()), site=self.repo) snak.setTarget(coord) return True return False
def string_to_wddate(isotimestamp: str) -> WbTime: """ Create a wikidata compatible wikibase date from an ISO 8601 timestamp """ date = WbTime.fromTimestr(isotimestamp, calendarmodel=Settings.calendarmodel) date.hour = 0 date.minute = 0 date.second = 0 date.precision = WbTime.PRECISION["day"] return date
def try_get_year_from_property_timestamp(entity_dict: Dict, property_id: str, oab_type: str) -> int: """Function for extracting the year from an inception timestamp Args: entity_dict: JSON response from wikidata property_id: Wikidata property id e. g. 'P18' stands for the property image oab_type: openArtBrowser type e. g. 'artwork', 'motif' important for logging Returns: Year from timestamp """ timestr = entity_dict[CLAIMS][property_id][0][MAINSNAK][DATAVALUE][VALUE][ TIME] return WbTime.fromTimestr(timestr).year
def _set_target(self, snak, value): if value in ('somevalue', 'novalue'): snak.setSnakType(value) return True def invalid_report(): pywikibot.warning('Invalid value "{}" for {} datatype'.format( value, snak.type)) if snak.type in self.entity_types: target = self.parse_entity(value) if target is None: pywikibot.warning('"LAST" magic word used without "CREATE"') else: snak.setTarget(target) return True elif snak.type == 'quantity': match = self.quantity_errR.fullmatch(value) if match: amount, error, unit = match.groups() else: match = self.quantity_boundsR.fullmatch(value) if match: groups = list(match.groups()) unit = groups.pop() amount, lower, upper = map(Decimal, groups) if lower > upper: error = amount - lower, upper - amount else: error = upper - amount, amount - lower if match: if unit: unit = pywikibot.ItemPage(self.repo, 'Q' + unit) quantity = WbQuantity(amount, unit, error, site=self.repo) snak.setTarget(quantity) return True else: invalid_report() elif snak.type == 'time': iso, _, prec = value.rpartition('/') if iso: time = WbTime.fromTimestr(iso, precision=int(prec), site=self.repo) snak.setTarget(time) return True else: invalid_report() elif snak.type in ('string', 'external-id', 'url', 'math'): literal = self.valid_text_literal(value) if literal: snak.setTarget(literal) return True else: invalid_report() elif snak.type == 'commonsMedia': literal = self.valid_text_literal(value) if literal: image_repo = self.repo.image_repository() snak.setTarget(pywikibot.FilePage(image_repo, literal)) return True else: invalid_report() # todo: elif snak.type in ('geo-shape', 'tabular-data'): elif snak.type == 'monolingualtext': lang, _, text = value.partition(':') literal = self.valid_text_literal(text) if literal: monotext = WbMonolingualText(literal, lang) snak.setTarget(monotext) return True else: invalid_report() elif snak.type == 'globe-coordinate': match = self.globeR.fullmatch(value) if match: coord = Coordinate( *map(float, match.groups()), precision=1e-4, # hardcoded as in claimit.py site=self.repo) snak.setTarget(coord) return True else: invalid_report() else: pywikibot.warning('"{}" datatype is not supported yet'.format( snak.type)) return False
def try_get_significant_events( result: Dict, oab_type: Optional[str] = SIGNIFICANT_EVENT) -> List[Dict]: """Maps the wikidata response for significant events to a list of dicts which is appended to an object Args: result: wikidata response oab_type: OpenArtBrowser type. Defaults to SIGNIFICANT_EVENT. Returns: List of JSON objects which represent significant events """ significant_events = [] qid = result[ID] for event in result[CLAIMS][ PROPERTY_NAME_TO_PROPERTY_ID[SIGNIFICANT_EVENT]]: event_dict = {LABEL[SINGULAR]: event[MAINSNAK][DATAVALUE][VALUE][ID]} for qualifiers in event[QUALIFIERS].values(): datatype = qualifiers[0][DATATYPE] property_id = qualifiers[0][PROPERTY] # Get property name from dict, if the name is not in the dict ignore it and take the id property = PROPERTY_ID_TO_PROPERTY_NAME.get( property_id, property_id) if datatype == TIME: event_dict.update({ property: WbTime.fromTimestr( qualifiers[0][DATAVALUE][VALUE][TIME]).year }) elif datatype == WIKIBASE_ITEM: event_dict.update({ property: list( map( lambda qualifier: qualifier[DATAVALUE][VALUE][ID], qualifiers, )) }) elif datatype == QUANTITY: event_dict.update( {property: float(qualifiers[0][DATAVALUE][VALUE][AMOUNT])}) event_dict.update({ f"{property}_{UNIT}": qualifiers[0][DATAVALUE][VALUE].get(UNIT, "").replace( WIKIDATA_ENTITY_URL, "") }) elif datatype in [STRING, URL]: event_dict.update({property: qualifiers[0][DATAVALUE][VALUE]}) elif datatype == MONOLINGUALTEXT: event_dict.update( {property: qualifiers[0][DATAVALUE][VALUE][TEXT]}) elif datatype == COMMONS_MEDIA: logger.error( f"commonsMedia type not supported in significant events on item {qid}" ) else: logger.error(f"Unknown datatype: {datatype} on item {qid}") event_dict.update({TYPE: SIGNIFICANT_EVENT}) significant_events.append(event_dict) return significant_events