Switch to using database for browse pages.
This commit is contained in:
parent
7313df54f7
commit
b952213b23
6 changed files with 253 additions and 85 deletions
|
|
@ -1,5 +1,6 @@
|
|||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from .database import session, now_utc
|
||||
from . import wikibase, utils
|
||||
from sqlalchemy.schema import Column, ForeignKey
|
||||
from sqlalchemy.types import Integer, String, DateTime, Boolean
|
||||
from sqlalchemy.orm import column_property, relationship, synonym
|
||||
|
|
@ -49,13 +50,59 @@ class DepictsItemAltLabel(Base):
|
|||
class Item(Base):
|
||||
__tablename__ = 'item'
|
||||
item_id = Column(Integer, primary_key=True, autoincrement=False)
|
||||
label = Column(String)
|
||||
# label = Column(String) # column removed 2019-12-18
|
||||
entity = Column(postgresql.JSON)
|
||||
lastrevid = Column(Integer, nullable=True, unique=True)
|
||||
modified = Column(DateTime, nullable=True)
|
||||
is_artwork = Column(Boolean, nullable=False, default=False)
|
||||
qid = column_property('Q' + cast(item_id, String))
|
||||
|
||||
def image_count(self):
|
||||
p18 = self.entity['claims'].get('P18')
|
||||
return len(p18) if p18 else 0
|
||||
|
||||
def image_filename(self):
|
||||
p18 = self.entity['claims'].get('P18')
|
||||
if not p18:
|
||||
return
|
||||
|
||||
try:
|
||||
return p18[0]['mainsnak']['datavalue']['value']
|
||||
except KeyError:
|
||||
return
|
||||
|
||||
@property
|
||||
def label(self):
|
||||
return wikibase.get_entity_label(self.entity)
|
||||
|
||||
@property
|
||||
def artist(self):
|
||||
v = wikibase.first_datavalue(self.entity, 'P170')
|
||||
if not v:
|
||||
return
|
||||
return v['id']
|
||||
|
||||
@property
|
||||
def depicts(self):
|
||||
return self.linked_qids('P180')
|
||||
|
||||
@property
|
||||
def instance_of(self):
|
||||
return self.linked_qids('P31')
|
||||
|
||||
def linked_qids(self, prop):
|
||||
values = self.entity['claims'].get(prop) or []
|
||||
return [v['mainsnak']['datavalue']['value']['id']
|
||||
for v in values
|
||||
if 'datavalue' in v['mainsnak']]
|
||||
|
||||
|
||||
@property
|
||||
def date(self):
|
||||
v = wikibase.first_datavalue(self.entity, 'P571')
|
||||
if v:
|
||||
return utils.format_time(v['time'], v['precision'])
|
||||
|
||||
class Triple(Base):
|
||||
__tablename__ = 'triple'
|
||||
subject_id = Column(Integer, primary_key=True)
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
from flask import request
|
||||
from itertools import islice
|
||||
from datetime import datetime
|
||||
import urllib.parse
|
||||
import inflect
|
||||
|
||||
|
|
@ -74,3 +75,25 @@ def wiki_url(title, site, ns=None):
|
|||
def get_int_arg(name):
|
||||
if name in request.args and request.args[name].isdigit():
|
||||
return int(request.args[name])
|
||||
|
||||
def format_time(time_value, precision):
|
||||
# FIXME handle dates like '1965-04-00T00:00:00Z'
|
||||
# FIXME handle BC dates properly, "120 B.C." instead of "-120"
|
||||
year = None
|
||||
if '-00' in time_value:
|
||||
# can't be represented as python datetime
|
||||
year = int(time_value[:time_value.find('-', 1)])
|
||||
else:
|
||||
t = datetime.strptime(time_value[1:], "%Y-%m-%dT%H:%M:%SZ")
|
||||
year = t.year
|
||||
|
||||
if precision == 9:
|
||||
return str(year)
|
||||
if precision == 8:
|
||||
return f'{year}s'
|
||||
if precision == 7:
|
||||
return f'{ordinal((year // 100) + 1)} century'
|
||||
if precision == 6:
|
||||
return f'{ordinal((year // 1000) + 1)} millennium'
|
||||
|
||||
return time_value
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue