3 from django.db import models
4 from wikidata.client import Client
7 class Entity(models.Model):
8 WIKIDATA_PREFIX = 'https://www.wikidata.org/wiki/'
10 WIKIDATA_COORDINATE_LOCATION = 'P625'
12 WIKIDATA_IMAGE_QUERY = './w/api.php?action=query&titles={}&format=json&prop=imageinfo&iiprop=url&iiurlwidth=240&iiurlheight=200'
14 uri = models.CharField(max_length=255, unique=True, db_index=True)
15 label = models.CharField(max_length=1024, blank=True)
16 description = models.CharField(max_length=2048, blank=True)
17 wikipedia_link = models.CharField(max_length=1024, blank=True)
18 lat = models.FloatField(null=True, blank=True)
19 lon = models.FloatField(null=True, blank=True)
20 images = models.TextField(blank=True)
23 def is_interesting(self):
24 return self.wikipedia_link or (self.lat and self.lon) or len(self.images)>2
27 if self.uri.startswith(self.WIKIDATA_PREFIX):
28 self.populate_from_wikidata(
29 self.uri[len(self.WIKIDATA_PREFIX):]
32 def populate_from_wikidata(self, wikidata_id):
34 client.opener.addheaders = [(
35 'User-Agent', 'Wolne Lektury / https://wolnelektury.pl / Python-wikidata'
37 entity = client.get(wikidata_id)
39 self.label = entity.label.get('pl', entity.label) or ''
40 self.description = entity.description.get('pl', entity.description) or ''
41 sitelinks = entity.attributes.get('sitelinks', {})
42 self.wikipedia_link = sitelinks.get('plwiki', sitelinks.get('enwiki', {})).get('url') or ''
44 location_prop = client.get(self.WIKIDATA_COORDINATE_LOCATION)
45 location = entity.get(location_prop)
46 if location and location.globe.id == self.WIKIDATA_EARTH:
47 self.lat = location.latitude
48 self.lon = location.longitude
50 images = entity.getlist(client.get(self.WIKIDATA_IMAGE))
54 "url": image.image_url,
55 "page": image.page_url,
56 "resolution": image.image_resolution,
59 result = client.request(
60 self.WIKIDATA_IMAGE_QUERY.format(
61 urllib.parse.quote(image.title)
65 result_data = next(iter(result['query']['pages'].values()))['imageinfo'][0]
66 image_data['thumburl'] = result_data['thumburl']
67 image_data['thumbresolution'] = [
68 result_data['thumbwidth'],
69 result_data['thumbheight']
71 if 'responsiveUrls' in result_data:
72 image_data['responsiveUrls'] = result_data['responsiveUrls']
74 image_data_list.append(image_data)
76 self.images = json.dumps(image_data_list)
79 class Reference(models.Model):
80 book = models.ForeignKey('catalogue.Book', models.CASCADE)
81 entity = models.ForeignKey(Entity, models.CASCADE)
84 unique_together = (('book', 'entity'),)
87 class Occurence(models.Model):
88 reference = models.ForeignKey(Reference, models.CASCADE)
89 section = models.IntegerField()
90 html = models.TextField()
93 ordering = ('section',)