Skip to content

Commit a052064

Browse files
committed
handles case where multiple "mc" ids are returned
1 parent 9e3454d commit a052064

File tree

3 files changed

+274
-1
lines changed

3 files changed

+274
-1
lines changed

boonli_api/api.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,17 @@ def _extract_api_data(text: str) -> ApiData:
8383
if not pid_tag:
8484
raise ParseError("Couldn't find value for PID")
8585
pid = int(pid_tag.get("value")) # type: ignore
86-
cur_mcid_tag = soup.find("a", attrs={"class": "mcycle_button"})
86+
87+
# It seems like the "cycles" overlap at least for the school I'm
88+
# using. So it's showing both the old and the new cycle for the same month.
89+
# I can't seem to find any metadata for the cycle, so just taking the
90+
# newest cycle here, which is the last one listed in my case. This is
91+
# bound to break or be wrong in other cases...
92+
#
93+
# Moreover, it will only show one cycle's menus, so if some weeks are in 1)
94+
# and some in 2), it will not show a complete menu listing for that period.
95+
96+
cur_mcid_tag = soup.find_all("a", attrs={"class": "mcycle_button"})[-1]
8797
if not cur_mcid_tag:
8898
raise ParseError("Couldn't find value for MCID")
8999
cur_mcid = int(cur_mcid_tag.get("id")) # type: ignore

tests/api_test.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,13 @@ def test_invalid_customer_id() -> None:
7979
api = BoonliAPI()
8080
with pytest.raises(LoginError):
8181
api.login("Iamconvincedthisdoesnotexist", "username", "password")
82+
83+
84+
def test_multiple_mctypes() -> None:
85+
"""Tests that we correctly handle multiple mc ids."""
86+
assert _extract_api_data(load_fixture("boonli_home_3.html")) == {
87+
"api_token": "8464B60E-2294-4248-9406-4AF01A676444",
88+
"pid": 909456,
89+
"sid": 1,
90+
"cur_mcid": 12,
91+
}

tests/fixtures/boonli_home_3.html

Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
<!DOCTYPE html>
2+
3+
<html lang="en">
4+
5+
<head>
6+
7+
<meta charset="utf-8">
8+
9+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
10+
11+
<meta name="viewport" content="width=device-width, initial-scale=1">
12+
13+
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
14+
15+
<title>Dwight School | Home</title>
16+
17+
<!-- Fonts -->
18+
<link rel="stylesheet" href="https://use.typekit.net/rce0mzw.css">
19+
<link rel="stylesheet" href="https://use.typekit.net/fqa8nex.css">
20+
21+
22+
23+
24+
25+
26+
27+
28+
29+
30+
31+
32+
33+
34+
35+
<!-- CSS -->
36+
<link rel="stylesheet" type="text/css" href="https://dwight.boonli.com/boonli/css/jquery.fancybox.css">
37+
<link rel="stylesheet" type="text/css"
38+
href="https://dwight.boonli.com/boonli/css/boonli.min.css?v=20221220083757" />
39+
<link rel="shortcut icon" href="https://dwight.boonli.com/boonli/images/favicon.ico" />
40+
<link rel="stylesheet" href="https://dwight.boonli.com/boonli/css/jquery-ui.css">
41+
42+
43+
44+
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
45+
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
46+
<!--[if lt IE 9]>
47+
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
48+
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
49+
<![endif]-->
50+
51+
52+
<!-- Facebook Pixel Code -->
53+
<script>
54+
!function (f, b, e, v, n, t, s) {
55+
if (f.fbq) return; n = f.fbq = function () {
56+
n.callMethod ?
57+
n.callMethod.apply(n, arguments) : n.queue.push(arguments)
58+
};
59+
if (!f._fbq) f._fbq = n; n.push = n; n.loaded = !0; n.version = '2.0';
60+
n.queue = []; t = b.createElement(e); t.async = !0;
61+
t.src = v; s = b.getElementsByTagName(e)[0];
62+
s.parentNode.insertBefore(t, s)
63+
}(window, document, 'script',
64+
'https://connect.facebook.net/en_US/fbevents.js');
65+
fbq('init', '589556301514411');
66+
fbq('track', 'PageView');
67+
</script>
68+
<noscript>
69+
<img height="1" width="1" src="https://www.facebook.com/tr?id=589556301514411&ev=PageView&noscript=1" />
70+
</noscript>
71+
<!-- End Facebook Pixel Code -->
72+
73+
</head>
74+
75+
<body>
76+
<span id="help_hover" style="display: none">Please contact your program administrator for questions regarding your
77+
lunch program.</span>
78+
<div class="sideBarMenu">
79+
<div class="menuTop">
80+
<h2>Allan Beaufour</h2>
81+
<ul class="subMenu">
82+
<li> <a href="#" title="Sign Out" id="sign_out">Sign Out</a> </li>
83+
</ul>
84+
</div>
85+
86+
<div class="menuList">
87+
<ul>
88+
<li> <a href="https://dwight.boonli.com/home" title="Home">Home | Order</a> </li>
89+
<li> <a href="https://dwight.boonli.com/myaccount" title="My Account">My Account</a> </li>
90+
<li> <a href="https://dwight.boonli.com/order/history" title="Order History">Order History</a> </li>
91+
<li> <a href="https://dwight.boonli.com/program_info" title="FAQ/Program Info">FAQ/Program
92+
Information</a> </li>
93+
<li> <a href="https://dwight.boonli.com/notifications" title="Notifications">Notifications</a> </li>
94+
<li> <a id="side-help-link" href="https://dwight.boonli.com/program_info" target="_boonli_help"
95+
title="Help">Help</a> </li>
96+
</ul>
97+
</div><!--//menuList-->
98+
</div><!--//SIDEBAR-->
99+
<div class="pageWrap" style="background-image:url(https://dwight.boonli.com/boonli/images/loginbg3.png);">
100+
<div class="pageWrap-overlay">
101+
102+
<nav class="top-navigation">
103+
<a class="menu-link" href="#" title="Menu">
104+
<span></span>
105+
<span></span>
106+
<span></span>
107+
</a>
108+
<h2 class="userName">Dwight School
109+
</h2>
110+
<ul class="user-menu cartmenu">
111+
<li> <a class="cart-icon" href="https://dwight.boonli.com/cart" title="Cart"><i></i><span
112+
class="cart-count">0</span></a> </li>
113+
</ul>
114+
</nav><!--//top-navigation-->
115+
<div class="loginInner-Wrap">
116+
117+
<div class="homeBox">
118+
119+
<div class="page-headbox">
120+
<div class="cal-links">
121+
<a class="print" href="https://dwight.boonli.com/print/orders/12/2022" target="print_orders"
122+
id="print_orders_link">View/Print Orders</a>
123+
</div>
124+
<div class="powered-by"><span class="cust-logo"><img
125+
src="https://dwight.boonli.com/images/dwight/ordering.png"
126+
alt="Dwight School" /></span></div>
127+
128+
<h2 class="home-welcome">Welcome</h2>
129+
<div class="month-Nav">
130+
<a class="previous" href="#" title="Previous Month"></a>
131+
<span id="curMonth">December, 2022</span>
132+
<a class="next" href="#" title="Next Month"></a>
133+
</div>
134+
135+
</div>
136+
137+
<div class="homeNav">
138+
<h5>Click below to order:</h5>
139+
<ul>
140+
141+
<li>
142+
<a href="#" class="mcycle_button " id="6" title="RVSD-Cycle #1">RVSD-Cycle #1</a>
143+
<input type="hidden" id="plist_6" value="Hans Letgeleiden" />
144+
<input type="hidden" id="mctype_6" value="calendar" />
145+
</li>
146+
<li>
147+
<a href="#" class="mcycle_button " id="12" title="RVSD-Cycle #2">RVSD-Cycle #2</a>
148+
<input type="hidden" id="plist_12" value="Hans Letgeleiden" />
149+
<input type="hidden" id="mctype_12" value="calendar" />
150+
</li>
151+
</ul>
152+
</div>
153+
154+
155+
156+
<div class="notifications">
157+
<ul>
158+
<li> <a href="https://dwight.boonli.com/program_info" id="prog_info">FAQ/Program
159+
Information</a> </li>
160+
<li> <a href="#" id="notifs">Notifications <span class="count-box">11</span></a> </li>
161+
</ul>
162+
</div>
163+
164+
</div> <!--//formBox-->
165+
166+
</div><!--//loginInner-Wrap-->
167+
168+
<div class="footer">
169+
<div class="copyRight">
170+
<div class="footerLogo"><span class="pow-by">Powered by</span><span class="by-logo"><a href="#"><img
171+
src="https://dwight.boonli.com/boonli/images/boonli_logo_small_powby_white.png"
172+
alt="Boonli" /></a></span></div>
173+
<p>©2022 Boonli, All Rights Reserved</p>
174+
</div>
175+
</div>
176+
177+
<script>xbat = '8464B60E-2294-4248-9406-4AF01A676444';</script>
178+
<form id="cal-form" action="https://dwight.boonli.com/cal" method="POST" style="">
179+
<input type="hidden" name="cm" id="cm" value="12" />
180+
<input type="hidden" name="cy" id="cy" value="2022" />
181+
<input type="hidden" name="pid" id="pid" value="909456" />
182+
<input type="hidden" name="sid" id="sid" value="1" />
183+
<input type="hidden" name="moa_enabled" id="moa_enabled" value="0" />
184+
<input type="hidden" name="no_profiles" id="no_profiles" value="0" />
185+
<input type="hidden" name="mcid" id="mcid" value="" />
186+
<input type="hidden" name="dtopismb" id="dtopismb" value="0" />
187+
<input type="hidden" name="sp" id="sp" value="0" />
188+
<input type="hidden" name="csrftk" value="8464B60E-2294-4248-9406-4AF01A676444">
189+
</form>
190+
191+
192+
193+
<div class="modal-popup" id="home_profile_msg" style="display: none">
194+
<div class="modal-popup-content">
195+
<a class="close-modal " href="#" id="close_profile_modal" title="Close"><img
196+
src="https://dwight.boonli.com/boonli/images/icons/icon_x_grey.png" alt="Close" /></a>
197+
<div class="massage-box">
198+
<p>&nbsp;</p>
199+
</div>
200+
</div>
201+
</div>
202+
<div id="proc_trans_loading" class="modal-popup" style="display: none">
203+
<div class="modal-popup-content">
204+
<div class="loader"></div>
205+
</div>
206+
</div>
207+
208+
209+
210+
211+
212+
213+
214+
</div><!--//pageWrap-overlay-->
215+
</div> <!--//pageWrap-->
216+
<div id="app"></div>
217+
218+
<!-- jQuery (JavaScript plugins) -->
219+
<script type="text/javascript" src="https://dwight.boonli.com/boonli/js/boonli2.min.js?v=25e7a1f0fa5d1605"></script>
220+
<script type="text/javascript" src="https://dwight.boonli.com/boonli/js/jquery.fancybox.js"></script>
221+
<script type="text/javascript" src="https://dwight.boonli.com/boonli/js/jquery.blockUI.js"></script>
222+
<script src="https://dwight.boonli.com/boonli/js/hm.min.js"></script>
223+
224+
225+
226+
<!-- Include all compiled plugins (below), or include individual files as needed -->
227+
<form id="logout-form" action="https://dwight.boonli.com/logout" method="POST" style="display: none;">
228+
<input type="hidden" name="csrftk" value="jWVt88HikSUhpbqCGIjo3izEMrDNXio5kwvqYU5Q">
229+
<input type="hidden" id="lpid" value="187008" />
230+
<input type="hidden" id="lsid" value="1" />
231+
<input type="hidden" id="lxbat" value="8464B60E-2294-4248-9406-4AF01A676444" />
232+
<input type="hidden" id="show_zd" value="0" />
233+
</form>
234+
235+
<div id="lgt-no-save" style="display: none" class="modal-popup">
236+
<div class="modal-popup-content">
237+
<a class="close-modal" href="#" title="Close"><img
238+
src="https://dwight.boonli.com/boonli/images/icons/icon_x_grey.png" alt="Close" /></a>
239+
<div class="text-align-center">
240+
<p class="msg-warning">WARNING!!</p>
241+
<p id="lgt-msg">You have items in your cart! If you continue to Sign Out, orders in your cart <span
242+
class="plum-bold">WILL NOT</span> be processed.</p>
243+
<a href="#" class="button" id="lgt_goto_cart" title="Save Cart">Go to Cart</a>
244+
<a href="#" class="text-nav" title="Sign Out" id="lgt_sign_out">Leave my items in the cart and Sign
245+
Out</a>
246+
</div>
247+
</div>
248+
</div>
249+
250+
<script src="https://dwight.boonli.com/boonli/js/jquery-ui.js"></script>
251+
</body>
252+
253+
</html>

0 commit comments

Comments
 (0)