-
Notifications
You must be signed in to change notification settings - Fork 41
/
Copy pathadd_helsinki_audience.py
168 lines (145 loc) · 6.01 KB
/
add_helsinki_audience.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
from functools import lru_cache
from django.core.management.base import BaseCommand, CommandError
from django.db import transaction
from events.models import DataSource, Event, Keyword, KeywordSet
HELSINKI_KEYWORD_SET_DATA = {
"id": "helsinki:audiences",
"name_en": "Helsinki audiences",
"name_fi": "Helsinki kohderyhmät",
"name_sv": "Helsingfors invånargrupper",
"data_source_id": "helsinki",
"usage": KeywordSet.AUDIENCE,
}
# keyword id mapping from hel.fi to YSO
KEYWORD_MAPPING = {
"helfi:1": [
"yso:p4354",
"yso:p13050",
], # lapset ja lapsiperheet -> lapset (ikään liittyvä rooli) & lapsiperheet
"helfi:2": ["yso:p11617"], # nuoret -> nuoret (ikään liittyvä rooli)
"helfi:3": ["yso:p6165"], # maahanmuuttajat -> maahanmuuttajat
"helfi:4": ["yso:p7179"], # vammaiset -> vammaiset
"helfi:5": ["yso:p2433"], # vanhukset -> ikääntyneet
"helfi:6": ["yso:p3128"], # yritykset -> yritykset
"helfi:7": ["yso:p1393"], # yhdistykset -> järjestöt
}
YSO_SOTE_KEYWORD_IDS = [
"yso:p12297", # mielenterveyspotilaat
"yso:p23886", # päihdekeskuskuntoutujat
]
EXTRA_AUDIENCE_KEYWORD_IDS = [
"yso:p7708", # työttömät
"yso:p16596", # matkailijat
]
NEW_SOTE_KEYWORDS_DATA = [
{
"id": "helsinki:aflfbatkwe",
"name_fi": "omaishoitoperheet",
"name_en": "informal care families",
"name_sv": "närståendevård familjer",
"data_source_id": "helsinki",
},
{
"id": "helsinki:aflfbat76e",
"name_fi": "palvelukeskuskortti",
"name_en": "service centre card",
"name_sv": "närståendevård kort",
"data_source_id": "helsinki",
},
]
class Command(BaseCommand):
help = "Creates SOTE keywords and Helsinki audience keyword set and adds YSO audience keywords to events." # noqa: E501
@lru_cache() # noqa: B019
def get_keyword_obj(self, keyword_id):
try:
keyword = Keyword.objects.get(id=keyword_id)
except Keyword.DoesNotExist:
raise CommandError('keyword "%s" does not exist' % keyword_id)
return keyword
@transaction.atomic
def create_sote_keywords(self):
self.stdout.write("creating new SOTE keywords...")
for new_keyword_data in NEW_SOTE_KEYWORDS_DATA:
keyword_set, created = Keyword.objects.update_or_create(
id=new_keyword_data["id"], defaults=new_keyword_data
)
if created:
self.stdout.write(
"created keyword %s (%s)"
% (new_keyword_data["name_fi"], new_keyword_data["id"])
)
else:
self.stdout.write(
"keyword %s (%s) already exist"
% (new_keyword_data["name_fi"], new_keyword_data["id"])
)
@transaction.atomic
def create_helsinki_audiences_keyword_set(self):
self.stdout.write("creating Helsinki audiences keyword set...")
# create the set itself
keyword_set, created = KeywordSet.objects.update_or_create(
id=HELSINKI_KEYWORD_SET_DATA["id"], defaults=HELSINKI_KEYWORD_SET_DATA
)
if created:
self.stdout.write(
'created keyword set "%s"' % HELSINKI_KEYWORD_SET_DATA["id"]
)
else:
self.stdout.write(
'keyword set "%s" already exist' % HELSINKI_KEYWORD_SET_DATA["id"]
)
# flatten YSO keyword IDs
yso_keyword_ids = [
val for sublist in KEYWORD_MAPPING.values() for val in sublist
]
# keywords to add to the set = YSO keywords corresponding to hel.fi + YSO
# SOTE keywords + new SOTE keywords
keyword_ids = (
yso_keyword_ids
+ YSO_SOTE_KEYWORD_IDS
+ EXTRA_AUDIENCE_KEYWORD_IDS
+ [kw["id"] for kw in NEW_SOTE_KEYWORDS_DATA]
)
# add the keywords to the set
existing_keywords = set(keyword_set.keywords.all())
for keyword_id in keyword_ids:
keyword = self.get_keyword_obj(keyword_id)
if keyword not in existing_keywords:
keyword_set.keywords.add(keyword)
existing_keywords.add(keyword)
self.stdout.write(
"added %s (%s) to the keyword set" % (keyword.name, keyword_id)
)
@transaction.atomic
def add_yso_audience_keywords_to_events(self):
self.stdout.write("adding YSO audience keywords to events...")
for event in Event.objects.exclude(audience__isnull=True).prefetch_related(
"audience"
):
for audience in event.audience.all():
# if current audience is a valid hel.fi audience keyword, iterate YSO
# keywords corresponding to it
for yso_keyword_id in KEYWORD_MAPPING.get(audience.id, []):
yso_keyword_obj = self.get_keyword_obj(yso_keyword_id)
if yso_keyword_obj not in event.audience.all():
event.audience.add(yso_keyword_obj)
self.stdout.write(
"added %s (%s) to %s"
% (yso_keyword_obj, yso_keyword_id, event)
)
def handle(self, *args, **options):
# Helsinki data source must be created if missing. Note that it is not necessarily the system data source. # noqa: E501
# If we are creating it, it *may* still be the system data source, so it
# must be user editable!
helsinki_data_source_defaults = {
"user_editable_resources": True,
"user_editable_organizations": True,
}
DataSource.objects.get_or_create(
id=HELSINKI_KEYWORD_SET_DATA["data_source_id"],
defaults=helsinki_data_source_defaults,
)
self.create_sote_keywords()
self.create_helsinki_audiences_keyword_set()
self.add_yso_audience_keywords_to_events()
self.stdout.write("all done")