Skip to content

Commit 200f23a

Browse files
authored
Added search routes to user_friendly, updated routes with limit, offset, order_by (#21)
* Create models for the corresponding section Create models representing the routes responses for each section. Added models for new section 'user_friendly' * Remove redundant classes related to the response * Remove redundant classes related to the response * Create an enum file for multiple enum types * Examples of errors in HTTP responses. * Update getting data and streaming data Added methods for getting data for 'user_friendly' section routes: 'get_members()' and 'get_members_info()'. Added Helper function for checking if some member Knesset id exists: 'is_mk_individual_exist()' Added streaming data option for large values of 'limit' and 'offset' when they are used. Added method for serialize jsons: 'json_serialize()' * Update routes info, new routes added Update routes errors responses and success response. Handle errors with 'HTTPException()' . Added 'user_friendly' section to routes. Simplified response by removing 'success' field, now returning only data. * Update queries.py Added new queries for 'get_members()','get_members_presence()' ,'get_members_votes()','get_members_attended_committee_meetings()','get_members_bills()'. Try query optimization for 'get_members()'. * Added errors.py to docker * Fixing PEP 8 * Adding get_member() query for returning single Knesset member user friendly * - Added get_member() - Added get_member_by_committee() - Added get_member_by_faction() - Added get_member_by_faction_chairperson() - Added get_member_by_govministries() - Added get_member_by_name() - Removing get_members_info() - Added is_knesset_term_exist() - Added is_mk_individual_exist() - Added named placeholders where needed - Added docstring to functions - Added logger.critical() when unknown execption is thrown - Updated create_query_list() logic, fixing order_by logic - Added option for disable named cursor in get_db_cursor() * - Added '/members/{mk_individual_id}' route - Added '/members/search/by-committee/{committee}' route - Added '/members/search/by-faction/{faction}' route - Added '/members/search/by-faction_chairperson/{faction}' route - Added '/members/search/by-govministries/{govministry}' route - Added '/members/search/by-name/{name}' route - Updated these user friendly routes with limit, offset, pagination, streaming : /members/{mk_individual_id}/presence /members/{mk_individual_id}/attended_committee_meetings /members/{mk_individual_id}/votes /members/{mk_individual_id}/bills - Order by logic was updated in routes which have limit and offset - The code is organized better, routes are grouped together per common section * Fixed field type in 'MkIndividualIDs' model
1 parent 5153b32 commit 200f23a

16 files changed

Lines changed: 4050 additions & 2841 deletions

api/db.py

Lines changed: 626 additions & 125 deletions
Large diffs are not rendered by default.

api/queries.py

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
def get_member_kns_query(id_field):
2-
return f"""
3-
SELECT
2+
return f"""
3+
SELECT
44
f."{id_field}",
55
f."FirstName",
66
f."LastName",
@@ -21,7 +21,7 @@ def get_member_kns_query(id_field):
2121
LEFT JOIN members_mk_individual_faction_chairpersons ch
2222
ON ch."mk_individual_id" = f."mk_individual_id"
2323
LEFT JOIN (
24-
SELECT
24+
SELECT
2525
jsonb_array_elements_text(m.member_mk_ids)::integer AS member_mk_id,
2626
array_agg(DISTINCT m.knesset) AS knesset_array
2727
FROM members_faction_memberships m
@@ -38,9 +38,10 @@ def get_member_kns_query(id_field):
3838
ORDER BY m."faction_name" DESC
3939
LIMIT 1;
4040
"""
41-
42-
def get_minister_query(id_field):
43-
return f"""
41+
42+
43+
def get_minister_query(id_field):
44+
return f"""
4445
SELECT
4546
f."{id_field}",
4647
f."FirstName",
@@ -93,7 +94,7 @@ def get_minister_query(id_field):
9394

9495

9596
def get_members():
96-
return f"""
97+
return """
9798
SELECT
9899
members_mk_individual.mk_individual_id,
99100
members_mk_individual.mk_individual_first_name,
@@ -110,12 +111,12 @@ def get_members():
110111
COALESCE(json_agg(DISTINCT migm.*), '[]') AS govministries
111112
FROM
112113
members_mk_individual
113-
LEFT JOIN members_mk_individual_committees mci ON members_mk_individual.mk_individual_id = mci.mk_individual_id AND mci.knesset = %s
114-
LEFT JOIN members_mk_individual_factions mif ON members_mk_individual.mk_individual_id = mif.mk_individual_id AND mif.knesset = %s
115-
LEFT JOIN members_mk_individual_faction_chairpersons mfcp ON members_mk_individual.mk_individual_id = mfcp.mk_individual_id AND mfcp.knesset = %s
116-
LEFT JOIN members_mk_individual_govministries migm ON members_mk_individual.mk_individual_id = migm.mk_individual_id AND migm.knesset = %s
114+
LEFT JOIN members_mk_individual_committees mci ON members_mk_individual.mk_individual_id = mci.mk_individual_id AND mci.knesset = %(knesset_term)s
115+
LEFT JOIN members_mk_individual_factions mif ON members_mk_individual.mk_individual_id = mif.mk_individual_id AND mif.knesset = %(knesset_term)s
116+
LEFT JOIN members_mk_individual_faction_chairpersons mfcp ON members_mk_individual.mk_individual_id = mfcp.mk_individual_id AND mfcp.knesset = %(knesset_term)s
117+
LEFT JOIN members_mk_individual_govministries migm ON members_mk_individual.mk_individual_id = migm.mk_individual_id AND migm.knesset = %(knesset_term)s
117118
WHERE
118-
members_mk_individual."IsCurrent" = %s
119+
members_mk_individual."IsCurrent" = %(is_current)s
119120
GROUP BY
120121
members_mk_individual.mk_individual_id, members_mk_individual.mk_individual_first_name,members_mk_individual.mk_individual_name,members_mk_individual."PersonID",members_mk_individual."GenderID"
121122
,
@@ -125,27 +126,61 @@ def get_members():
125126
members_mk_individual.altnames;
126127
"""
127128

128-
def get_members_presence(mk_individual_id:int):
129-
return f"""select * from members_presence where
129+
130+
def get_member():
131+
return """
132+
SELECT
133+
members_mk_individual.mk_individual_id,
134+
members_mk_individual.mk_individual_first_name,
135+
members_mk_individual.mk_individual_name,
136+
members_mk_individual."PersonID",
137+
members_mk_individual."GenderID",
138+
members_mk_individual."GenderDesc",
139+
members_mk_individual."IsCurrent",
140+
members_mk_individual.mk_individual_email,
141+
members_mk_individual.altnames,
142+
COALESCE(json_agg(DISTINCT mci.*), '[]') AS committee_positions,
143+
COALESCE(json_agg(DISTINCT mif.*), '[]') AS factions,
144+
COALESCE(json_agg(DISTINCT mfcp.*), '[]') AS faction_chairpersons,
145+
COALESCE(json_agg(DISTINCT migm.*), '[]') AS govministries
146+
FROM
147+
members_mk_individual
148+
LEFT JOIN members_mk_individual_committees mci ON members_mk_individual.mk_individual_id = mci.mk_individual_id AND mci.knesset = %(knesset_term)s
149+
LEFT JOIN members_mk_individual_factions mif ON members_mk_individual.mk_individual_id = mif.mk_individual_id AND mif.knesset = %(knesset_term)s
150+
LEFT JOIN members_mk_individual_faction_chairpersons mfcp ON members_mk_individual.mk_individual_id = mfcp.mk_individual_id AND mfcp.knesset = %(knesset_term)s
151+
LEFT JOIN members_mk_individual_govministries migm ON members_mk_individual.mk_individual_id = migm.mk_individual_id AND migm.knesset = %(knesset_term)s
152+
WHERE
153+
members_mk_individual."mk_individual_id" = %(mk_individual_id)s
154+
GROUP BY
155+
members_mk_individual.mk_individual_id, members_mk_individual.mk_individual_first_name, members_mk_individual.mk_individual_name, members_mk_individual."PersonID", members_mk_individual."GenderID",
156+
members_mk_individual."GenderDesc", members_mk_individual."IsCurrent", members_mk_individual.mk_individual_email, members_mk_individual.altnames;
157+
"""
158+
159+
160+
def get_members_presence(mk_individual_id: int):
161+
return f"""select * from members_presence where
130162
mk_id = {mk_individual_id} order by date desc
131163
"""
132164

133-
def get_members_attended_committee_meetings(mk_individual_id:int):
165+
166+
def get_members_attended_committee_meetings(mk_individual_id: int):
134167
return f"""SELECT
135-
"CommitteeSessionID", "KnessetNum", "TypeID", "TypeDesc",
168+
"CommitteeSessionID", "KnessetNum", "TypeID", "TypeDesc",
136169
"CommitteeID",
137170
"Location", "SessionUrl", "BroadcastUrl",
138171
"StartDate", "FinishDate", "Note",
139-
topics, committee_name, bill_names, bill_types,
172+
topics, committee_name, bill_names, bill_types,
140173
related_to_legislation
141174
FROM
142175
people_committees_meeting_attendees
143176
WHERE
144177
attended_mk_individual_ids @> '[{mk_individual_id}]'
145178
"""
146179

147-
def get_members_votes(mk_individual_id:int):
148-
return f"""SELECT knesset_num, session_id, sess_item_id, sess_item_dscr, vote_item_id, vote_item_dscr, vote_date, vote_time, is_elctrnc_vote, is_accepted, total_for, total_against, total_abstain, 'pro' AS mk_vote
180+
181+
def get_members_votes(mk_individual_id: int):
182+
return f"""SELECT * FROM (
183+
SELECT knesset_num, session_id, sess_item_id, sess_item_dscr, vote_item_id, vote_item_dscr, vote_date, vote_time, is_elctrnc_vote, is_accepted, total_for, total_against, total_abstain, 'pro' AS mk_vote
149184
FROM votes_view_vote_rslts_hdr_approved_extra
150185
WHERE mk_ids_pro @> '[{mk_individual_id}]'
151186
@@ -159,10 +194,12 @@ def get_members_votes(mk_individual_id:int):
159194
160195
SELECT knesset_num, session_id, sess_item_id, sess_item_dscr, vote_item_id, vote_item_dscr, vote_date, vote_time, is_elctrnc_vote, is_accepted, total_for, total_against, total_abstain, 'abstain' AS mk_vote
161196
FROM votes_view_vote_rslts_hdr_approved_extra
162-
WHERE mk_ids_abstain @> '[{mk_individual_id}]';
163-
"""
197+
WHERE mk_ids_abstain @> '[{mk_individual_id}]'
198+
) a
199+
"""
164200

165-
def get_members_bills(mk_individual_id:int):
201+
202+
def get_members_bills(mk_individual_id: int):
166203
return f"""SELECT
167204
bkb."BillID",
168205
bkb."KnessetNum",
@@ -192,5 +229,4 @@ def get_members_bills(mk_individual_id:int):
192229
bills_kns_bill bkb ON bkb."BillID" = bkb_init."BillID"
193230
WHERE
194231
mki.mk_individual_id = {mk_individual_id}
195-
"""
196-
232+
"""

0 commit comments

Comments
 (0)