[00:00:28] getcoreName is a class method on the gateway adapter base class [00:00:58] and donation_interface_email_pattern_filter is a global fn defined in the localsettings file [00:01:33] for custom, rapid-deploy fraud filters based on scammers using a predicatable email pattern [00:02:41] so it also shows in the filter_name field [00:02:54] - will jump on staging & look at some data [00:03:19] eileen: so, those values are transmuted to columns in order to get a single row for each donation attempt [00:06:30] ah I see [00:07:02] it’s just throwing me cos it looks wrong in the list [00:08:22] (PS2) Eileen: Add Score name & also generic filter name filter [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507722 (https://phabricator.wikimedia.org/T219646) [00:09:40] (CR) Ejegg: "I'm doubting whether the 1-char url variables were a good idea. Maybe it'll be less confusing for CCogdill if we follow the same conventio" [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507226 (owner: Cstone) [00:10:48] (PS3) Eileen: Add Score name & also generic filter name filter [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507722 (https://phabricator.wikimedia.org/T219646) [00:13:20] eileen: so you'd filter on filter_name when you don't actually want all the columns? [00:13:31] I'm a little confused as to how to use that [00:13:44] ejegg: yeah maybe it wouldn’t be useful [00:13:57] you can already choose which columns you want, right? [00:14:11] in the contribution recur pivot it is useful if you want to exclude some processors for example [00:14:13] I guess maybe it'd be more efficient with the actual filter_name filter [00:15:09] I just pulled the update onto staging to see [00:15:36] although i struggle to figure out good test data with these [00:16:35] ok - not working anyway - removing rather than debugging since we might not want it [00:17:10] (PS4) Eileen: Add Score name & also generic filter name filter [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507722 (https://phabricator.wikimedia.org/T219646) [00:19:55] eileen: looks good! Want to update the commit msg to match? [00:20:51] (PS5) Eileen: Add Score name & new email filter, also Ip Blacklist as there doesn't seem to be a good reason to exclude [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507722 (https://phabricator.wikimedia.org/T219646) [00:21:26] (CR) Ejegg: [C: +2] Add Score name & new email filter, also Ip Blacklist as there doesn't seem to be a good reason to exclude [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507722 (https://phabricator.wikimedia.org/T219646) (owner: Eileen) [00:21:54] ejegg: ok I’ll do a deploy [00:22:47] awesome! [00:22:59] Fundraising Sprint It Came From Out of Scope, Fundraising-Backlog: Civi: create 'known fraudster' checkbox in CIDs - https://phabricator.wikimedia.org/T221688 (Eileenmcnaughton) Checkbox now added - we can add logging during the outage [00:25:45] (Merged) jenkins-bot: Add Score name & new email filter, also Ip Blacklist as there doesn't seem to be a good reason to exclude [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507722 (https://phabricator.wikimedia.org/T219646) (owner: Eileen) [00:33:24] (PS1) Eileen: Merge branch 'master' of https://gerrit.wikimedia.org/r/wikimedia/fundraising/crm into deployment [wikimedia/fundraising/crm] (deployment) - https://gerrit.wikimedia.org/r/507723 [00:33:57] (CR) Eileen: [C: +2] Merge branch 'master' of https://gerrit.wikimedia.org/r/wikimedia/fundraising/crm into deployment [wikimedia/fundraising/crm] (deployment) - https://gerrit.wikimedia.org/r/507723 (owner: Eileen) [00:34:24] (Merged) jenkins-bot: Merge branch 'master' of https://gerrit.wikimedia.org/r/wikimedia/fundraising/crm into deployment [wikimedia/fundraising/crm] (deployment) - https://gerrit.wikimedia.org/r/507723 (owner: Eileen) [00:35:30] !log civicrm revision changed from 3414657d36 to 01c4d15c9a, config revision is 2119df9495 [00:35:33] Logged the message at https://wikitech.wikimedia.org/wiki/Server_Admin_Log [00:51:44] Fundraising Sprint It Came From Out of Scope, Fundraising Sprint Navel Warfare, Fundraising Sprint Outie Inverter, Fundraising Sprint Prank Seatbelt, and 6 others: Import email-only contacts from 'remind me later' links into CiviCRM - https://phabricator.wikimedia.org/T160949 (Eileenmcnaughton) J... [03:08:04] (PS1) Eileen: Change update of cancel_reason to use batching [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507737 (https://phabricator.wikimedia.org/T218616) [03:10:15] (PS2) Eileen: Change update of cancel_reason to use batching [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507737 (https://phabricator.wikimedia.org/T218616) [04:26:30] Fundraising Sprint It Came From Out of Scope, Fundraising Sprint Navel Warfare, Fundraising Sprint Outie Inverter, Fundraising Sprint Prank Seatbelt, and 6 others: Import email-only contacts from 'remind me later' links into CiviCRM - https://phabricator.wikimedia.org/T160949 (Eileenmcnaughton) @... [04:40:20] Fundraising Sprint It Came From Out of Scope, Fundraising-Backlog: Civi: create 'known fraudster' checkbox in CIDs - https://phabricator.wikimedia.org/T221688 (Eileenmcnaughton) a:Eileenmcnaughton [04:40:28] Fundraising Sprint It Came From Out of Scope, Fundraising-Backlog: Civi: create 'known fraudster' checkbox in CIDs - https://phabricator.wikimedia.org/T221688 (Eileenmcnaughton) [04:41:13] Fundraising Sprint A series of unfortunate event handlers, Fundraising Sprint Bert and Ernie's Excellent Adventure, Fundraising Sprint Casino Royale With Cheese, Fundraising Sprint Da Vinci Coder, and 6 others: Iterate on DS fredge query - https://phabricator.wikimedia.org/T219646 (Eileenmcnaughto... [04:43:11] Fundraising Sprint Hansel and grep -l, Fundraising Sprint It Came From Out of Scope, Fundraising-Backlog, Fr-CiviCRM-dedupe-FY2017/18, Patch-For-Review: Civi dedupe: merge screen upgrades - https://phabricator.wikimedia.org/T217903 (Eileenmcnaughton) a:Eileenmcnaughton [04:43:39] Fundraising Sprint It Came From Out of Scope, Fundraising-Backlog, Fr-CiviCRM-dedupe-FY2017/18: Civi dedupe: CID range + lifetime$ possible to combine? - https://phabricator.wikimedia.org/T204878 (Eileenmcnaughton) a:Eileenmcnaughton [04:43:52] Fundraising Sprint It Came From Out of Scope, Fundraising-Backlog, Fr-CiviCRM-dedupe-FY2017/18: Civi dedupe: create 'batch mark not duplicate' button - https://phabricator.wikimedia.org/T221270 (Eileenmcnaughton) a:Eileenmcnaughton [05:39:23] ejegg|away: the translation variables are shown as $var to translators (and in the translation unit pages) and get replaced by Translate in the translation pages [05:40:06] which is one reason you're only supposed to use the output of translation pages in the normal wiki-based message groups [05:40:41] the other formats for placeholders were things not supported by Translate that you used for some other variable replacement system out of MediaWiki, AFAIK [08:47:53] Fundraising-Backlog: New mobile iFrame errors - https://phabricator.wikimedia.org/T221385 (jrobell) As mentioned to @MBeat33 I had two testers in Sweden trying to donate from their Iphone. One of them made a donation using AMEX without any issues, the other one got the attached error message when using Safar... [12:42:15] Fundraising-Backlog, MediaWiki-extensions-DonationInterface, Continuous-Integration-Config, Patch-For-Review, Release-Engineering-Team (Kanban): Fundraising should fall back to non master - https://phabricator.wikimedia.org/T199130 (hashar) Open→Resolved Assuming it is fixed properly... [13:45:20] Nemo_bis: so if we want the [amount] to appear [13:45:59] in the tramslated page when we grab the text with the API, ahould we just not use tvar? [13:57:02] ejegg: where do you get the text from? [13:57:15] as in, what title (if you ask for wikitext) [13:58:01] one sec [13:58:33] Nemo_bis: here's this year's https://meta.wikimedia.org/wiki/Fundraising/Translation/Thank_you_email_2018-10-01 [13:58:44] note that the translations have a ton of $variables [13:59:05] and here's 2017's, where the translations look right, at least on the 'Read' tab [13:59:20] https://meta.wikimedia.org/wiki/Fundraising/Translation/Thank_you_email_20171019 [14:00:07] So, I don't know if something changed in the translate UI to cause that, or if we just had to fix all the 2017 vars after the fact [14:07:44] Nemo_bis: of course, this is all ending up in a system based on CiviCRM and drupal [14:08:12] Fundraising Sprint It Came From Out of Scope, Fundraising-Backlog: Civi: create 'known fraudster' checkbox in CIDs - https://phabricator.wikimedia.org/T221688 (MBeat33) Great, thank you @Eileenmcnaughton [14:08:37] so if there's a better way to have drupal send text to translatewiki and snag translations back, I'd love to hear it! [14:31:44] Fundraising-Backlog, Analytics, Analytics-Kanban: CentralNoticeImpression refined impressionEventSampleRate is int instead of double - https://phabricator.wikimedia.org/T217109 (Milimetric) a:Milimetric [14:45:01] ejegg: in the translation pages I see the text as you presumably want it, with the [variables] and {checks [14:45:05] https://meta.wikimedia.org/wiki/Fundraising/Translation/Thank_you_email_2018-10-01/it?action=edit [14:45:29] oh, cool, italian looks good [14:46:03] ahh, looks like someone has been fixing them since yesterday [14:46:30] transforming those pieces of untranslatable markup into tvars is not necessary (if translators understand they're not supposed to translate them) but can help make them look more familiar [15:10:39] tskaff: looks like the fixes are all set in the 'Translation' tabs, but a few don't show up in the 'Read' tabs. I guess they probably just need to be set to 'Published' ? [15:14:16] Hmm I am still seeing $amount in the read version of published emails. [15:14:53] I am assuming I'll need to go into all the translations & update code to [amount], publish it again to fix the problem. [15:15:38] Another thought ... [15:16:23] The one place this is a persistent problem is in an edited version of English that starts with "[ifRecurring] Your donation keeps Wikipedia independent, ... " [15:16:43] since that has not yet been deployed, could it be affecting the behavior of the translated version? [15:18:12] In other words ... clicking thru all the "Read" versions of the translations, it is that one paragraph where I'm still seeing $amount [15:18:34] All the others seem ok [15:38:00] ejegg Would it make sense to try deploying only English first, to see if that would fix the issue with that one paragraph? [15:53:11] tskaff: the process of deploying stuff to Civi should have no effect at all on the wiki-translations [16:02:09] ejegg, do you have a few minutes for me to pick you brain? [16:02:17] your* [16:05:37] oh I forgot the staff community time has just kicked off! [16:07:54] oops, yeah, I should tune in [18:20:33] Fundraising-Backlog, fundraising-tech-ops: Outage to reload triggers - https://phabricator.wikimedia.org/T222001 (Jgreen) >>! In T222001#5151358, @Eileenmcnaughton wrote: > @CCogdill_WMF it looks like Ops Do have another outage need so this should be able to be done then - @cwd @jgreen hopefully this is... [18:58:01] Fundraising-Backlog, fundraising-tech-ops: Outage to reload triggers - https://phabricator.wikimedia.org/T222001 (CCogdill_WMF) @TSkaff confirmed that Monday works for the banner team! [19:22:08] cstone so what languages still need $fixing ? [19:25:11] (CR) Ejegg: "Thanks for catching this! We did this same thing in another patch before noticing yours, so I'll abandon this one." [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507556 (owner: Umherirrender) [19:25:19] (Abandoned) Ejegg: Add alias for special page EmailPreferences [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507556 (owner: Umherirrender) [19:26:06] AndyRussG: do you have plans for getCanonicalURL? https://gerrit.wikimedia.org/r/#/c/mediawiki/extensions/CentralNotice/+/497223/6/includes/Campaign.php [19:29:35] (CR) Ejegg: [C: +2] Change update of cancel_reason to use batching [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507737 (https://phabricator.wikimedia.org/T218616) (owner: Eileen) [19:34:14] (Merged) jenkins-bot: Change update of cancel_reason to use batching [wikimedia/fundraising/crm] - https://gerrit.wikimedia.org/r/507737 (https://phabricator.wikimedia.org/T218616) (owner: Eileen) [19:38:37] (PS1) Ejegg: Merge branch 'master' into deployment [wikimedia/fundraising/crm] (deployment) - https://gerrit.wikimedia.org/r/507865 [19:38:48] (CR) Ejegg: [C: +2] Merge branch 'master' into deployment [wikimedia/fundraising/crm] (deployment) - https://gerrit.wikimedia.org/r/507865 (owner: Ejegg) [19:39:29] (Merged) jenkins-bot: Merge branch 'master' into deployment [wikimedia/fundraising/crm] (deployment) - https://gerrit.wikimedia.org/r/507865 (owner: Ejegg) [19:41:30] !log updated CiviCRM from 01c4d15c9a to 5024c968ed [19:41:33] Logged the message at https://wikitech.wikimedia.org/wiki/Server_Admin_Log [19:43:27] ejegg not sure, I'll check in a bit! [19:53:36] Fundraising-Backlog, Analytics, Analytics-Kanban: CentralNoticeImpression refined impressionEventSampleRate is int instead of double - https://phabricator.wikimedia.org/T217109 (Milimetric) Ok, done, and now I'm seeing `"impressionEventSampleRate":0.01` in the data, so all is good going forward. Tha... [19:54:23] Fundraising-Backlog, Analytics, Analytics-Kanban: CentralNoticeImpression refined impressionEventSampleRate is int instead of double - https://phabricator.wikimedia.org/T217109 (Milimetric) Open→Resolved [20:02:03] ejegg may I inquire as to the context of ur inquiry? [20:04:06] Fundraising-Backlog, FR-Ingenico, Fr-backlog-cleanup-Q3_2017-18: TY page in ingenico iframe - https://phabricator.wikimedia.org/T176669 (Ejegg) @pcoombe I think we saw more issues like this recently. We try to get the redirect / pop out correct on payments-wiki, but just in case we make a mistake the... [20:04:27] AndyRussG|ish: oh, I was about to +2 that patch when I realized that fn was unused [20:04:35] or seemed unused in any case [20:04:56] so, just in the interest of not adding dead code [20:05:57] ejegg which patch? [20:06:12] https://gerrit.wikimedia.org/r/#/c/mediawiki/extensions/CentralNotice/+/497223/6/ [20:06:39] ejegg okok thx I'll check it out! [20:24:45] Fundraising Sprint A series of unfortunate event handlers, Fundraising Sprint Bert and Ernie's Excellent Adventure, Fundraising Sprint Casino Royale With Cheese, Fundraising Sprint Da Vinci Coder, and 9 others: Reduce recurring TY emails - https://phabricator.wikimedia.org/T213209 (Ejegg) ca - [g... [20:28:40] Nemo_bis: aha, I think I see the problem - one of the source paragraphs doesn't actually contain the tag [20:28:59] looking at https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Fundraising%2FTranslation%2FThank+you+email+2018-10-01&action=page&filter=&language=nl [20:29:16] there's one paragraph where the english is just 'If you ever want to cancel your monthly support, please see our [$recurringCancel easy cancellation instructions].' [20:29:29] but the translation has a few more sentences [20:29:42] tskaff: ^^^ I think explains why it's just a problem with that one paragraph [20:30:28] Nemo_bis: but if I look at the english version of the TY letter, at https://meta.wikimedia.org/wiki/Fundraising/Translation/Thank_you_email_2018-10-01 [20:30:49] The paragraph IS updated, with the extra sentences and the tvar [20:31:13] So is some translation component getting the source versions from a stale cache? [20:31:51] Nemo_bis: it's the 7th paragraph, the one that starts with [ifRecurring] [20:33:55] Fundraising Sprint A series of unfortunate event handlers, Fundraising Sprint Bert and Ernie's Excellent Adventure, Fundraising Sprint Casino Royale With Cheese, Fundraising Sprint Da Vinci Coder, and 9 others: Reduce recurring TY emails - https://phabricator.wikimedia.org/T213209 (Ejegg) ok, it... [20:51:25] sorry for the failmails fr-tech [20:51:44] I thought I had deployed eileen's batching fix for the cancel_reason updates [20:51:56] but I had rsynced the wrong project [20:52:02] trying again now [20:52:32] XenoRyet and cstone shall we do a DonationInterface deploy to check on the existing changes? [20:52:45] or do you want to wait till all the new stuff is done too? [20:53:50] Actually might be a good idea to deploy what's there now [20:54:00] fewer suspects if something does go wrong. [20:54:32] cool, do you want to do that or should i? [20:54:52] If you don't mind, I'm kind of in the middle of something. [20:54:58] But if you're on something else too, I can do it. [20:55:13] na, i got it [20:55:42] Cool, thanks. [20:56:32] (PS1) Ejegg: Merge branch 'master' into deployment [extensions/DonationInterface] (deployment) - https://gerrit.wikimedia.org/r/507875 [20:56:36] (CR) Ejegg: [C: +2] Merge branch 'master' into deployment [extensions/DonationInterface] (deployment) - https://gerrit.wikimedia.org/r/507875 (owner: Ejegg) [21:00:38] (Merged) jenkins-bot: Merge branch 'master' into deployment [extensions/DonationInterface] (deployment) - https://gerrit.wikimedia.org/r/507875 (owner: Ejegg) [21:00:56] (PS1) Ejegg: Update DonationInterface submodule [core] (fundraising/REL1_31) - https://gerrit.wikimedia.org/r/507877 [21:00:59] (CR) Ejegg: [C: +2] Update DonationInterface submodule [core] (fundraising/REL1_31) - https://gerrit.wikimedia.org/r/507877 (owner: Ejegg) [21:01:17] XenoRyet: this deploy will include your c_t patch. Want to watch the logs with me for any suspicious behavior? [21:01:28] (when that merges, that is) [21:01:29] Yea, let me go find my key [21:02:28] Should be no impact without the flag, but we all know code doesn't always do as it should [21:15:49] (Merged) jenkins-bot: Update DonationInterface submodule [core] (fundraising/REL1_31) - https://gerrit.wikimedia.org/r/507877 (owner: Ejegg) [21:17:37] ok, looks like traffic's pretty slow [21:18:49] (CR) jenkins-bot: Update DonationInterface submodule [core] (fundraising/REL1_31) - https://gerrit.wikimedia.org/r/507877 (owner: Ejegg) [21:18:53] got that yubikey XenoRyet ? [21:19:02] Yep [21:19:06] Tailing stuff now [21:20:40] !log updated payments-wiki from aa8dad50e7 to 558427f731 [21:20:42] Logged the message at https://wikitech.wikimedia.org/wiki/Server_Admin_Log [21:21:37] so we should expect a few js errors in the first few minutes [21:27:59] Looking ok so far [21:33:16] ahh, need to allow access to Special:EmailPreferences [21:38:14] well, opt-in page is visible at least: https://payments.wikimedia.org/index.php?title=Special:EmailPreferences/optin&v=wle_001 [21:38:22] looks like we need to hide the links at the bottom [21:38:55] wiki-standard about / privacy policy / disclaimers, that we don't actually put in wiki-standard places on payments [21:48:36] (PS1) Ejegg: Email prefs form gets skinOverride CSS too [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507891 [21:49:10] ok, that should hide those links ^^^ [21:54:44] (CR) XenoRyet: [C: +2] Email prefs form gets skinOverride CSS too [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507891 (owner: Ejegg) [21:55:47] (Merged) jenkins-bot: Email prefs form gets skinOverride CSS too [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507891 (owner: Ejegg) [21:56:06] XenoRyet and cstone: anything I can do to help with the opt-in work? [21:57:34] I guess one question I had is what the contact hash is for? The civi api doesn't appear to need it to update contacts. [21:57:47] XenoRyet: no, the civi api doesn't [21:58:06] we use it so ppl can't just change any random contact's email address [21:58:19] by throwing random contact_ids into the url [21:58:34] we should only accept contact_id from the url if it has a contact_hash with it [21:59:06] then in the civi code, we should first check if the hash matches the one stored for that contact id, before we change the email address to whatever they've given us on the opt in form [21:59:24] Ok, that makes sense. [21:59:45] There's logic to that effect in the main wmf_civicrm contact import function [22:00:55] So in terms of this opt-in page, how are we expecting that to work if a normal user just gives us an existing email address. They won't have their id or hash, but are we going to update anyway? [22:01:23] yeah, with no ID or hash, we just update the matching contact record to opted in [22:01:29] that part is already working [22:02:28] So is this the part where we have an id and hash, but a different email? That part won't stick in my head for some reason [22:02:51] right, to let people change the email address associated with their contact id [22:03:16] So if we have the id, we change the primary email and opt it in [22:03:16] I see cstone has a front-end patch to gather them - were you doing the backend bit? [22:03:29] Yea, that's what I'm working on [22:03:33] XenoRyet: yep, as long as the provided hash also matches [22:04:07] Ok, that definitely clears some things up that were confusing me. [22:05:31] So, we should probably extract wmf_civicrm.module lines 188-205 into a function that we can call from the opt in queue consumer [22:06:17] function wmf_civicrm_contact_hash_matches_id($msg) [22:09:21] noted [22:13:35] I suppose I should eat something at some point today. [22:32:26] (PS2) Cstone: Add contact_id and contact_hash to opt-in form. [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507226 [22:35:54] (CR) jerkins-bot: [V: -1] Add contact_id and contact_hash to opt-in form. [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507226 (owner: Cstone) [23:00:15] (PS3) Cstone: Add contact_id and contact_hash to opt-in form. [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507226 [23:03:52] (CR) jerkins-bot: [V: -1] Add contact_id and contact_hash to opt-in form. [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507226 (owner: Cstone) [23:05:19] (PS4) Cstone: Add contact_id and contact_hash to opt-in form. [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507226 [23:20:31] (CR) Ejegg: "This works! The queue stuff in the test is a bit silly though... If we want to test queue stuff, we could either set up an integration-y t" (2 comments) [extensions/DonationInterface] - https://gerrit.wikimedia.org/r/507226 (owner: Cstone) [23:22:11] cstone: so if we wanted to break the processing logic out from the UI class (EmailPreferences), what would be the best way to do that without making it confusing? [23:24:18] hmm is that what I attempted to do there? I was trying to separate it enough to test it [23:25:03] cstone right, it looked like you were going that route, and I was thinking we could do a bit more [23:26:43] So, if we wanted to test the queue bits, we should actually call the executeOptIn method, right? [23:27:40] but as a part of the EmailPreferences page, with all of its rendering, it would be a much bigger test [23:28:19] so what if we went a little ways back in the other direction from this radically simplified thing [23:28:47] So EmailPreferences::execute would have a method getProcessor( $subpage ) [23:29:08] that will return either an OptInProcessor or an UnsubscribeProcessor [23:29:42] err, rather, execute() would call $processor = $this->getProcessor( $subpage ) [23:29:59] then in a try{} block just do $processor->validate [23:30:21] and then $processor->execute [23:30:35] then finally $this->renderSuccess( $subpage ) [23:30:48] and in the catch{} block it would $this->renderError [23:30:53] ok that makes sense to break down the execute [23:31:25] so we would make an abstract class emailProcessor, which would have the validate bits [23:32:10] and then an OptInProcessor and UnsubscribeProcessor that inherit from it, and have execute methods [23:32:31] So you could test that execute method, (which makes the message and sends it to the queue) [23:32:40] as well as the validation [23:32:54] to see whether the validation throws the error you expect [23:33:52] lmk if you want to try this out live via goog chat [23:37:04] cstone oh, hey, we could also validate contact_id to make sure it's an integer [23:37:50] nice good idea, let me take a stab at it first [23:39:04] k, i'm going to run a quick errand. back in a bit