/
models.py
91 lines (72 loc) · 2.76 KB
/
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
from zope.interface import implementer
from sqlalchemy import (
Column,
String,
Unicode,
Integer,
Boolean,
ForeignKey,
UniqueConstraint,
)
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.hybrid import hybrid_property
from clld import interfaces
from clld.db.meta import Base, CustomModelMixin
from clld.db.models.common import (
Language,
Parameter,
DomainElement,
Contribution,
IdNameDescriptionMixin,
)
class Family(Base, IdNameDescriptionMixin):
pass
class Genus(Base, IdNameDescriptionMixin):
family_pk = Column(Integer, ForeignKey('family.pk'))
subfamily = Column(Unicode)
family = relationship(Family)
class Area(Base, IdNameDescriptionMixin):
dbpedia_url = Column(String)
#-----------------------------------------------------------------------------
# specialized common mapper classes
#-----------------------------------------------------------------------------
@implementer(interfaces.ILanguage)
class WalsLanguage(Language, CustomModelMixin):
pk = Column(Integer, ForeignKey('language.pk'), primary_key=True)
ascii_name = Column(String)
genus_pk = Column(Integer, ForeignKey('genus.pk'))
samples_100 = Column(Boolean, default=False)
samples_200 = Column(Boolean, default=False)
genus = relationship(Genus)
@implementer(interfaces.IContribution)
class Chapter(Contribution, CustomModelMixin):
"""Contributions in WALS are chapters chapters. These comprise a set of features with
corresponding values and a descriptive text.
"""
pk = Column(Integer, ForeignKey('contribution.pk'), primary_key=True)
#id = Column(Integer, unique=True)
blog_title = Column(Unicode)
area_pk = Column(Integer, ForeignKey('area.pk'))
area = relationship(Area)
@implementer(interfaces.IParameter)
class Feature(Parameter, CustomModelMixin):
"""Parameters in WALS are called feature. They are always related to one chapter.
"""
__table_args__ = (UniqueConstraint('contribution_pk', 'ordinal_qualifier'),)
pk = Column(Integer, ForeignKey('parameter.pk'), primary_key=True)
contribution_pk = Column(Integer, ForeignKey('contribution.pk'))
id = Column(String(5), unique=True)
blog_title = Column(String(50), unique=True)
chapter = relationship(Chapter)
ordinal_qualifier = Column(String)
@property
def sortkey(self):
return self.contribution_pk, self.ordinal_qualifier
@implementer(interfaces.IDomainElement)
class WalsValue(DomainElement, CustomModelMixin):
"""All features in WALS have fixed lists of admissible values.
"""
pk = Column(Integer, ForeignKey('domainelement.pk'), primary_key=True)
icon_id = Column(String(4))
numeric = Column(Integer)