Skip to content
This repository has been archived by the owner on Jun 19, 2018. It is now read-only.

Commit

Permalink
minor cosmetic fixes to member pages, added index page with names of …
Browse files Browse the repository at this point in the history
…all members, added join-mks pipeline
  • Loading branch information
OriHoch committed Jan 30, 2018
1 parent 922fdc1 commit af5e158
Show file tree
Hide file tree
Showing 7 changed files with 236 additions and 37 deletions.
28 changes: 17 additions & 11 deletions build_members.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from template_functions import get_jinja_env
import logging, os, subprocess
from datetime import datetime
from template_functions import build_template
from template_functions import build_template, get_context
from constants import MEMBER_URL, POSITION_URL, MINISTRY_URL, FACTION_URL

def main():
Expand All @@ -11,19 +11,25 @@ def main():
jinja_env = get_jinja_env()
jinja_env.filters['datetime'] = datetimeformat

all_mks = []
for descriptor, resource in zip(datapackage["resources"], resources):
for member in resource:
build_template(jinja_env,
"member_detail.html",{
"first_name": member["mk_individual_first_name"],
"last_name": member["mk_individual_name"],
"photo": member["mk_individual_photo"],
"positions": sortpositions(member["positions"]),
"position_url": POSITION_URL,
"ministry_url":MINISTRY_URL,
"faction_url": FACTION_URL},
build_template(jinja_env, "member_detail.html",
get_context({"first_name": member["mk_individual_first_name"],
"last_name": member["mk_individual_name"],
"photo": member["mk_individual_photo"],
"positions": sortpositions(member["positions"]),
"position_url": POSITION_URL,
"ministry_url": MINISTRY_URL,
"faction_url": FACTION_URL,
"source_member_schema": descriptor["schema"],
"source_member_row": member}),
MEMBER_URL.format(member_id=member["mk_individual_id"]))

all_mks.append({"first_name": member["mk_individual_first_name"],
"last_name": member["mk_individual_name"],
"url": MEMBER_URL.format(member_id=member["mk_individual_id"])})
build_template(jinja_env, "members_index.html",
get_context({"all_mks": sorted(all_mks, key=lambda mk: mk["first_name"])}), "members/index.html")
if os.environ.get("SKIP_STATIC") != "1":
subprocess.check_call(["mkdir", "-p", "dist"])
subprocess.check_call(["cp", "-rf", "static", "dist/"])
Expand Down
1 change: 1 addition & 0 deletions constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
FACTION_URL = "factions/{faction_id}.html"
COMMITTEE_LIST_KNESSET_URL = "committees/knesset-{num}.html"
COMMITTEES_INDEX_URL = "committees/index.html"
MEMBERS_HOME_URL = "members/index.html"
114 changes: 114 additions & 0 deletions join_mks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
from datapackage_pipelines.wrapper import ingest, spew
import logging, requests


parameters, datapackage, resources = ingest()
aggregations = {"stats": {}}
kns_mksitecode, kns_person = None, None
kns_person_descriptor = None
kns_persontoposition, kns_position = None, None
mk_individual_resource, mk_individual_descriptor = None, None


mk_altnames = {}
for mk, mk_name in zip(*requests.get("https://oknesset.org/api/knesset-data/get_all_mk_names.json").json()):
mk_altnames.setdefault(int(mk["id"]), set()).add(mk_name.strip())


for descriptor, resource in zip(datapackage["resources"], resources):
if descriptor["name"] == "kns_mksitecode":
kns_mksitecode = {int(row["SiteId"]): row for row in resource}
elif descriptor["name"] == "kns_person":
kns_person = {int(row["PersonID"]): row for row in resource}
kns_person_descriptor = descriptor
elif descriptor["name"] == "mk_individual":
mk_individual_resource = resource
mk_individual_descriptor = descriptor
elif descriptor["name"] == "kns_position":
kns_position = {int(row["PositionID"]): row for row in resource}
elif descriptor["name"] == "kns_persontoposition":
kns_persontopositions = {}
for row in resource:
kns_persontopositions.setdefault(int(row["PersonID"]), []).append(row)
else:
for row in resource:
pass


KNOWN_MK_PERSON_IDS = {
955: kns_person[30407] # Yehuda Glick - has a mismatch in name between mk_individual and kns_person
}


# TODO: remove this mk matching function once this bug is fixed: https://github.com/hasadna/knesset-data/issues/147
def find_matching_kns_person(mk):
for person_id, person in kns_person.items():
person_first, person_last, person_email = person["FirstName"].strip(), person["LastName"].strip(), person["Email"]
mk_first, mk_last, mk_email = mk["mk_individual_first_name"].strip(), mk["mk_individual_name"].strip(), mk["mk_individual_email"]
name_match = (len(person_first) > 1 and len(mk_first) > 1 and person_first == mk_first and person_last == mk_last)
email_match = (person_email and mk_email
and len(person_email.strip()) > 5 and len(mk_email.strip()) > 5 and
person_email.strip().lower() == mk_email.strip().lower())
if name_match or email_match:
return person_id, person
person = KNOWN_MK_PERSON_IDS.get(int(mk["mk_individual_id"]))
if person:
return person["PersonID"], person
return None, None


def get_person_positions(person_id):
for kns_persontoposition_row in kns_persontopositions[person_id]:
mk_position = {field: kns_persontoposition_row[field] for field in ("KnessetNum",
"GovMinistryID", "GovMinistryName",
"DutyDesc",
"FactionID", "FactionName",
"GovernmentNum",
"CommitteeID", "CommitteeName")}
if not parameters.get("filter-knesset-num") or int(mk_position["KnessetNum"]) in parameters["filter-knesset-num"]:
position_id = int(kns_persontoposition_row["PositionID"])
position = kns_position[position_id]
finish_date = kns_persontoposition_row["FinishDate"]
mk_position.update(start_date=kns_persontoposition_row["StartDate"].strftime('%Y-%m-%d %H:%M:%S'),
finish_date=finish_date.strftime('%Y-%m-%d %H:%M:%S') if finish_date else None,
position=position["Description"],
position_id=position_id,
gender={250: "f", 251: "m", 252: "o"}[int(position["GenderID"])],)
yield {k: v for k, v in mk_position.items() if v}


def get_mk_individual_resource(resource):
for mk_individual_row in resource:
mk_individual_id = int(mk_individual_row["mk_individual_id"])
kns_person_id, kns_person_row = None, None
mksitecode = kns_mksitecode.get(mk_individual_id)
if mksitecode:
kns_person_id = int(mksitecode["KnsID"])
kns_person_row = kns_person.get(kns_person_id)
if not kns_person_row:
logging.warning("person mismatch in kns_mksitecode for mk_individual_id {}".format(mk_individual_id))
kns_person_id = None
if not kns_person_id:
kns_person_id, kns_person_row = find_matching_kns_person(mk_individual_row)
if not kns_person_id or not kns_person_row:
raise Exception("Failed to find matching person for mk_invidual {}".format(mk_individual_id))
if parameters.get("filter-is-current") is None or kns_person_row["IsCurrent"] == parameters["filter-is-current"]:
mk_individual_row.update(**kns_person_row)
mk_individual_row["positions"] = list(get_person_positions(kns_person_id))
altnames = mk_altnames.setdefault(mk_individual_id, set())
altnames.add("{} {}".format(mk_individual_row["mk_individual_first_name"].strip(),
mk_individual_row["mk_individual_name"].strip()).strip())
altnames.add("{} {}".format(kns_person_row["FirstName"].strip(),
mk_individual_row["LastName"].strip()).strip())
mk_individual_row["altnames"] = list(altnames)
yield mk_individual_row


mk_individual_descriptor["schema"]["fields"] += kns_person_descriptor["schema"]["fields"] \
+ [{"name": "positions", "type": "array"},
{"name": "altnames", "type": "array"}]


spew(dict(datapackage, resources=[mk_individual_descriptor]),
[get_mk_individual_resource(mk_individual_resource)],
aggregations["stats"])
39 changes: 37 additions & 2 deletions pipeline-spec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,42 @@ download_members:
parameters:
out-path: data/members

join-mks:
pipeline:
- run: load_resource
parameters:
url: data/members/datapackage.json
resource: kns_mksitecode
- run: load_resource
parameters:
url: data/members/datapackage.json
resource: kns_persontoposition
- run: load_resource
parameters:
url: data/members/datapackage.json
resource: kns_position
- run: load_resource
parameters:
url: data/members/datapackage.json
resource: kns_person
# join_mks iterates over this resource, it must be the last one
- run: load_resource
parameters:
url: data/members/datapackage.json
resource: mk_individual
- run: join_mks
# parameters:
# filter-knesset-num: [20]
# filter-is-current: true
# - run: filter
# parameters:
# resources: mk_individual
# in:
# - mk_individual_id: 109
- run: dump.to_path
parameters:
out-path: data/mks-joined

build:
pipeline:
# all these tables are loaded into memory
Expand Down Expand Up @@ -190,9 +226,8 @@ create_members:
# all these tables are loaded into memory
- run: load_resource
parameters:
url: data/members_aggr/datapackage.json
url: data/mks-joined/datapackage.json
resource: mk_individual
- run: stream_remote_resources
- run: build_members

join-attendance-data:
Expand Down
5 changes: 3 additions & 2 deletions template_functions.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from jinja2 import Environment, FileSystemLoader, select_autoescape
import os, logging
import socket, datetime
from constants import COMMITTEES_INDEX_URL
from constants import COMMITTEES_INDEX_URL, MEMBERS_HOME_URL


def get_jinja_env():
Expand Down Expand Up @@ -30,4 +30,5 @@ def get_context(context):
return dict(context, **{"create_hostname": socket.getfqdn(),
"create_time": datetime.datetime.now().strftime("%H:%M"),
"create_date": datetime.datetime.now().strftime("%d/%m/%Y"),
"committeelist_url": COMMITTEES_INDEX_URL})
"committeelist_url": COMMITTEES_INDEX_URL,
"members_home_url": MEMBERS_HOME_URL})
59 changes: 37 additions & 22 deletions templates/member_detail.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{% extends "site_base.html" %}

{% block breadcrumbs %}
<li><a href="{{members_home_url}}">ח"כים וסיעות</a> <span class="divider">/</span></li>
<li class="active">{{first_name}} {{last_name}}</li>
{% endblock %}

Expand All @@ -27,11 +28,12 @@ <h1>{{first_name}} {{last_name}}</h1>
<header>
<h2>
<i class="fa fa-users"></i>
תפקדים
תפקידים
</h2>
</header>
<ul id="recent-committees">
{% for position in positions %}
{% if position.FactionID or position.GovMinistryID or position.CommitteeID %}
<li>
<p class="item-action">
הכנסת ה{{position.KnessetNum}}
Expand All @@ -45,33 +47,46 @@ <h2>
{% endif %}
</p>
<p class="item-title">
<a href="{{position_url | replace('{position_id}', position.position_id)}}">
{{position.position}}
</a>
</p>
<p class="item-context">

{% if position.FactionID %}
<a href="{{faction_url | replace('{faction_id}', position.FactionID)}}">
סיעה {{position.FactionName}}
</a>
<!--<a href="{{faction_url | replace('{faction_id}', position.FactionID)}}">-->
{{position.FactionName}}
<!--</a>-->
{% elif position.GovMinistryID %}
<!--<a href="{{ministry_url | replace('{ministry_id}', position.GovMinistryID)}}">-->
{{position.GovMinistryName}}
<!--</a>-->
{% elif position.CommitteeID %}
<!--<a href="{{committee_url | replace('{committee_id}', position.CommitteeID)}}">-->
{{position.CommitteeName}}
<!--</a>-->
{% endif %}

{% if position.GovMinistryID %}
<a href="{{ministry_url | replace('{ministry_id}', position.GovMinistryID)}}">
{% if position.GovMinistryID == 28 %}
{{position.GovMinistryName}}
{% else %}
משרד ממשלתי : {{position.GovMinistryName}}
{% endif %}
</a>
{% endif %}

</p>
<p class="item-context">
{{position.position}}
</p>
</li>
{% endif %}
{% endfor %}
</ul>
</section>
</div>
</div>
{% endblock %}
{% endblock %}

{% block data_sources %}
{{ super() }}
<p>להלן נתוני המקור כפי שהם מופיעים במאגרי המידע של הכנסת באמצעות ממשק מידע פרלמנטרי זמין - </p>
<p style="font-size:130%;"><u><b>ח"כ</b></u></p>
{% for field in source_member_schema.fields %}
{% if field.name == "positions" %}
<b>positions</b>:
<ul>{% for position in positions %}
<li>{{position}}</li>
{% endfor %}</ul>
{% elif field.description and source_member_row[field.name] %}
<b>{{field.description}}</b>: <p>{{source_member_row[field.name]}}</p>
{% else %}
<b>{{field.name}}</b>: <p>{{source_member_row[field.name]}}</p>
{% endif %}
{% endfor %}
{% endblock %}
27 changes: 27 additions & 0 deletions templates/members_index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{% extends "site_base.html" %}

{% block breadcrumbs %}
<li class="active">ח"כים וסיעות</li>
{% endblock %}

{% block divcontent %}
<div class="row">
<div class="cards span8">
<section class="card card-list">
<header>
<h1><i class="fa fa-users"></i>כל הח"כים</h1>
</header>
<ul>
{% for mk in all_mks %}
<li><p class="item-title">
<a href="{{ mk.url }}">{{ mk.first_name }} {{ mk.last_name }}</a>
</p></li>
{% endfor %}
</ul>
</section>
</div>
<div class="span4">
<!-- stats -->
</div>
</div>
{% endblock %}

0 comments on commit af5e158

Please sign in to comment.