[07:50:29] 6Multimedia, 10Tool-Labs-tools-Other: create tool to crunch metrics for views (play started) of video and audio files - https://phabricator.wikimedia.org/T116363#1892512 (10Nemo_bis) [11:10:14] 6Multimedia, 10UploadWizard: New language dropdown at Special:UploadWizard makes selection very tedious - https://phabricator.wikimedia.org/T121971#1892593 (10Nemo_bis) 3NEW [11:59:43] 6Multimedia, 6Commons, 10MediaWiki-extensions-GWToolset: Mark GWToolset uploads with a change tag - https://phabricator.wikimedia.org/T121877#1890710 (10Steinsplitter) GWT has a own logentry. https://commons.wikimedia.org/w/index.php?title=Special%3ALog&type=gwtoolset&user=&page=&year=&month=-1&tagfilter=&hi... [12:03:53] 6Multimedia, 6Commons, 10MediaWiki-extensions-GWToolset: Mark GWToolset uploads with a change tag - https://phabricator.wikimedia.org/T121877#1892642 (10matmarex) Right, but the uploads still appear on https://commons.wikimedia.org/wiki/Special:Log/upload or https://commons.wikimedia.org/wiki/Special:NewFi... [15:41:13] Hello! Can anyone help guide me on this task? https://phabricator.wikimedia.org/T85685. I'm not sure if what I'm doing is right. [15:48:41] Hi MtDu_, let me look [15:49:04] MtDu_: What are you doing? [15:49:36] +marktraceur: Right now, I am working on the if statement to check if the author and lastuploader are the same. [15:50:20] OK, sounds right [15:50:57] And then...I would probably add a fifth parameter, which is not passed in if they're different, but it's the same as $2 if the author is the uploader. [15:51:02] +marktraceur: Here is what I have so far. https://dpaste.de/ZWwC Those are two things I have written, but I'm not sure if I'm doing this right. I'm confused about how to set the gender, (where I get it, if I just add it to creditparams, etc) [15:51:22] Uhh er [15:51:41] MtDu_: The MediaWiki language system has a magic word for gender. Let me find them thar documentations [15:52:00] https://www.mediawiki.org/wiki/Localisation#.E2.80.A6on_user_names_via_GENDER [15:52:16] +marktraceur: Also, in the if statement, I had to strip the html in order to compare the two, so the first one is definitely wrong. [15:52:55] Er [15:53:00] I don't know what you mean [15:54:19] So I'm comparing the author with the lastuploader. But the author is in html while lastUploader is a username, so I need to strip the tags to compare them. The function I am using is in another file in the extension. [15:54:55] OK sure [15:55:24] But once I compare, I'm not sure how to add gender as a parameter, and how to determine the gender of the user. [15:55:35] So you do something like $.parseHTML( author ).get( 0 ).textContent to get the text, and then you check that and also try stripping User: off the front [15:55:46] You don't need the gender [15:55:50] The API knows the gender [15:55:59] The only thing you need to do is pass in the username as Yet Another Parameter [15:56:39] So if the call currently looks like mw.message( 'mw-whatever-message-it-is', username ) then you make it mw.message( 'mw-whatever-message-it-is', username, username ) [15:56:48] You're passing in the same thing twice, but there's a reason for it. [15:57:16] Because if the author and uploader are different, you *won't* pass it in a second time, and the GENDER API will use the neuter form of all words [15:58:07] Then you change the qqq.json entry for the message to say "$5 is the username of the author, if we know it - sometimes we don't" or something equally apologetic to our put-upon translators [15:58:42] That's just a hint to them about how to translate stuff - so in this case, the Greek people will log on and say "ooh, neat, we have gender-specific articles now" [15:59:26] But you don't need to change the English message, because English doesn't use gendered pronouns or articles in that sentence at all. [16:00:19] MtDu_: Am I making sense? It's 10:00 on a Saturday and I just cracked open my first caffeine of the day. [16:00:46] +marktraceur: You are helping me tons. I'm a GCI student, so this is all new to me. I really appreciate it. [16:01:29] +marktraceur: Here is what I have now. https://dpaste.de/XCpb Look at lines 33-38. [16:02:19] +marktraceur: Also, about what you said earlier about stripping the User: part, would that be necessary, since both of them have the User: part? [16:02:33] Oh. I didn't realize that. [16:03:09] You might want to strip /^[\:]/ anyway just to be safe, though if you come up with empty strings be sure that's not a false positive [16:03:40] People might do something silly like put author=Usario:Super Spanish Dude and then the uploader would be User:Super Spanish Dude and your test wouldn't work [16:04:01] Though I'm not sure if Commons has namespace redirects for that sort of thing [16:04:28] Ok. So I just add a .strip(/^[\:]) after I strip the html from it? [16:04:37] Sort of yes. [16:04:43] Let me read your code, hold on [16:04:59] Also, you're a GCI student, is MatmaRex supposed to be helping you out? [16:05:13] Also, in lines 34 and 37 in the snippet, does it need to be creditText = mw.message blahblahblah? [16:05:45] And, he is not my mentor on this task. TGR is, and so is Mooey as well as Robson [16:05:58] I have a question for you [16:06:15] Yes? [16:06:17] Assuming that lastUploader is a plain username, and author is an HTML string, what will this.htmlUtils.htmlToText(info.imageInfo.author == info.imageInfo.lastUploader ) always return? [16:06:54] Is the problem that I'm missing a parentheses? [16:07:03] Yuuuup [16:07:14] But also I'm curious [16:07:18] Finding htmlToText now. [16:07:46] In lines 34 and 37, do I need to say creditText = the message instead of saying the message? [16:08:12] Oh, man, we were too smart for our own good. It would have given you a warning. [16:08:15] Uh, one sec [16:08:23] Ok [16:08:43] And btw, I will be going home from where I am soon, so I will get back on in like 30 minutes. [16:08:53] MtDu_: OK, yes, you need to put the mw.message return value somewhere [16:09:07] But also, you have that happening at line 31 just to get overridden anyway [16:09:14] Ohhhh [16:09:24] I did it like this. [16:09:25] https://dpaste.de/845x [16:09:36] Not sure if that works. [16:09:38] OK, there's a problem [16:09:42] Where's titleText? [16:10:09] At the top, it's a variable. [16:10:11] Where's the byline? Where's the license name? [16:10:20] Right, but how do they get into the message? [16:10:33] Look at line 31, it is the key [16:10:43] I see. [16:11:25] Are you familiar with Function.prototype.apply in javascript? [16:12:05] No. Perhaps something like this? https://dpaste.de/YZjj [16:12:17] Not quite [16:12:35] So you know that JavaScript functions are actually objects with funny hats on [16:12:36] Ok. What's wrong? [16:12:42] Yep. [16:12:56] They have methods, and two of the most useful are .apply() and .call() [16:13:39] So .apply only takes two things, [16:13:49] If I have a function that's called doSomething, I can say doSomething.call( {}, 1, 2 ) to call the function with the first and second arguments being 1 and 2, and the this argument being an empty object\ [16:14:13] Apply does the same thing, except that it looks like doSomething.apply( {}, [ 1, 2 ] ) [16:14:19] The arguments are all in an array. [16:14:44] Especially useful in this case, because we don't know how many arguments we're passing into the message - we don't even know which message it is! [16:15:02] So. Does that mean I need to add the username parameters into the creditParams? [16:15:09] Exactly! [16:15:19] The existing call to mw.message on line 31 will take care of the rest [16:15:47] Just make sure you put the new parameters after the existing ones - we don't want to end up with weird outcomes when the license text is replaced by a second copy of the uploader's username [16:16:05] "Uploaded by MarkTraceur, under the terms of MarkTraceur" is hilarious but not especially legally binding [16:16:15] So if it needs gender, I need to write this twice. creditParams.push( username ); [16:16:33] You should only need it once, at the end [16:16:58] Didn't you say it needed the username twice? [16:17:39] So right before the creditText = line, check if the author is present, check if the author and lastUploader are the same, and then push username into the creditParams array. [16:17:50] The first time is in the byline. [16:18:00] That got handled by a utility method and it's all sorted out. [16:18:55] So I only need to add the username parameter once if it needs gender? [16:19:13] Because byline already passes the user in? [16:20:13] Right. [16:20:35] So like this? https://dpaste.de/HV9u [16:21:17] No, you're still overriding creditText after line 31 [16:21:31] And you need to check whether there's any author or byline set [16:21:45] And it needs to happen before line 31 [16:22:05] Ok. Will do this when I get home. Will you be able to help me in 30 minutes? [17:07:35] Hm, I'm starting to wonder what happened to mtdu [17:08:07] (03PS5) 10Sn1per: Generalize warning system [extensions/UploadWizard] - 10https://gerrit.wikimedia.org/r/258100 (https://phabricator.wikimedia.org/T120905) [17:08:34] (03PS6) 10Sn1per: Generalize warning system [extensions/UploadWizard] - 10https://gerrit.wikimedia.org/r/258100 (https://phabricator.wikimedia.org/T120905) [17:21:01] Morning MatmaRex [17:21:25] Welcome back MtDu__ [17:21:29] Hello! [17:21:32] You're underscored [17:21:57] hey marktraceur [17:22:15] MtDu__: To answer your question, I can help you out in between chores, but I've spent nearly three weeks without a roommate and this place has no shortage of mess to clean up [17:22:25] She gets back in two days. [17:22:38] Ok. No problem. I just need to get this done by today. Hopefully. So. I don't need to overwrite creditText? That stays there. Just whenever I need gender, I just do mw.message. [17:22:45] I have the robots working on it. [17:22:59] MtDu__: No, you don't need to call mw.message, there's already a call to it [17:23:15] https://dpaste.de/Hu9R [17:23:33] MtDu__: The only thing you should be changing is creditParams, by adding username to it, *only if* there's an author, a byline, and a lastUploader that matches the author. [17:23:45] So don't even do the mw.message. [17:23:50] Just push the parameter. [17:23:54] MtDu__: Except for the one that's already there, exactly [17:24:08] So. I don't really even need an else clause. [17:24:33] Nope. None of the other conditionals have them either. [17:24:54] So hopefully this is right. [17:24:55] https://dpaste.de/XEPL [17:25:15] MtDu__: Nope [17:25:18] MtDu__: Only because of the order [17:25:30] Got it. I was wondering about that. [17:25:38] MtDu__: creditParams must be complete *before* mw.message gets called, or you aren't changing anything substantive [17:25:59] yep yep. [17:26:11] https://dpaste.de/91an [17:26:40] One more thing. What is the difference between .plain and .text [17:29:37] MtDu__: plain I think doesn't escape stuff [17:30:02] Hydronium: Ok. So in this case, I would use plain? [17:30:02] https://www.mediawiki.org/wiki/Manual:Messages_API#Using_messages_in_JavaScript [17:30:13] https://dpaste.de/91an [17:30:26] oh, plain() doesn't activate {{}} blocks and such [17:30:30] so in this case you want text [17:31:23] MtDu__: No need to change the call to mw.message, whatever it was before is fine [17:31:29] Hydronium: Also, https://phabricator.wikimedia.org/T85685 says to add another API request to fetch gender of user in needGender(). Could you explain to me how to do that? (Intro to APIs) [17:31:35] Oh, I guess text is better [17:31:41] Just like how to add another API request. [17:31:54] MtDu__: You can test this by changing the en.json version of the message to do something with the gender of the author [17:32:15] And making an image that uses {{information}} with author=User:MtDu or whatever on your local wiki [17:35:09] First, I need to update the en.json and qqq file right? So the message in en.json now looks like. https://dpaste.de/dxOw [17:35:23] Yes [17:35:26] . [17:37:10] Is this message ok for the qqq message? https://dpaste.de/poHe [17:38:36] Looks fine at a glance [17:39:50] Wait. If the GENDER parameter is passed as $5, do I need to change the message from "multimediaviewer-text-embed-credit-text-tbls": "\"$1\" by {{GENDER:$2}}. Licensed under $3 via $4", to "multimediaviewer-text-embed-credit-text-tbls": "\"$1\" by {{GENDER:$5}}. Licensed under $3 via $4",? [17:40:09] MtDu__: English doesn't need GENDER [17:40:20] Don't change en.json except for testing. [17:40:54] I still change the qqq file though right? [17:41:12] For that message and all the others that need GENDER. [17:41:26] Well, for the one you added GENDER support to. [17:41:28] Or ones. [17:41:45] I guess anything with a "b" in the trail would count. [17:41:50] But they'd be different arguments [17:41:54] Lol i18n.\ [17:42:45] Lol. I'm just doing to whichever ones have "\"$1\" by $2 [17:42:54] Exactly [17:47:37] So now. What do I do to test it? [17:47:56] Upload a file to vagrant and test mmv? [17:49:38] FYI $wgResourceLoaderDebug = true; in your vagrant LocalSettings.php is helpful because you can click on the JS console error trace and not get a minified mess [17:51:08] Hydronium: Ok. So I added that to the file. I have vagrant running and am on the home page logged in as Admin. Where do I upload the file? [17:51:24] Wait found it. [17:53:56] Once I upload it. I go to Special: MMV? [17:56:20] Hydronium: So. I uploaded it and opened in MMV. Is there something I need to type in for the author, licensing info, etc to test it? [18:00:59] +marktraceur: I've uploaded the file in my local wiki and am viewing it with MMV. I can't seem to find a message. [18:01:10] Go to Wikimedia Commons [18:01:23] Export the Description template and import it into your local wiki [18:01:32] and use it. It should provide the metadata the MMV uses [18:04:34] Hydronium: Can you walk me through it? [18:07:35] Hydronium: Right now, I'm on the Commons page. I look at export/print, but I can't seem to find the Description template [18:08:04] Hold up, I am making sure what i said works [18:08:50] Hydronium: No problem. [18:13:23] eh, my vagrant is broken again [18:13:44] Ok: In the meantime, can you guide me on the second part? [18:14:54] Go to Special:Export on Commond [18:14:54] So right now, needGender only accounts for one message using GENDER. I need to make it work for all of the other messages that use GENDER. My mentor said to possibly use an extra API request to fetch the gender of the user, and to try to avoid so if the translation doesn't need it. [18:14:56] Commons [18:15:02] Ok. [18:15:09] You want to export Special:Information I think [18:15:18] then go to Special:import on vagrant and import it [18:15:25] then insert the template in the file description page [18:16:20] So I said export Special:Information [18:16:34] When it said add pages to categories. [18:17:27] Which boxes do I check? Include only the current revision, not the full history, Include templates, and Save as file [18:17:29] Oh, my bad [18:17:32] Template:Information [18:17:47] Include templates [18:17:57] Check all three boxes [18:19:31] So when I import, I upload file. Which box to check? Import to default locations, Import to a namespace, or Import as subpages of the following page [18:20:15] well, preferably we would want the Template to be imported to the same location [18:20:31] Import to a namespace changes the namespace, and import as subpages imports it underneath one parent page [18:20:39] as "pseudo-namespace" of sorts [18:21:11] Ok. Once I import it, what did you say to do? [18:22:10] Add it to your file, with the appropriate parameters [18:23:04] How do I do that? [18:24:28] It gave me this. Import failed: The content model 'Scribunto' is not registered on this wiki. See https://www.mediawiki.org/wiki/Content_handlers to find out which extensions handle this content model. [18:26:25] Enable Scribunto on your vagrant [18:26:30] using vagrant roles [18:27:02] Hydronium: Ok. In the meantime while its provisioning, can you help me with the second part? [18:27:10] Hydronium: So right now, needGender only accounts for one message using GENDER. I need to make it work for all of the other messages that use GENDER. My mentor said to possibly use an extra API request to fetch the gender of the user, and to try to avoid so if the translation doesn't need it. [18:28:46] um [18:29:01] I think you already have the API requset [18:29:15] you just should optimize needGender so that it only runs when it is needed [18:29:33] because it would be an awful waste to request user gender from the API only to not use it [18:29:46] I don't understand when it needs to run and when it doesnt. [18:29:56] Is it just based on the language and translation? [18:30:32] This is what it looks like now. https://dpaste.de/V5eN [18:32:03] exactly [18:32:16] you need to add more stuff to that function to check if the messages differ in the current language [18:32:27] Right now it checks one message that uses {{GENDER}} [18:32:34] but you are adding another message that uses ^ [18:32:51] So I have to do the same thing for each? [18:32:53] so you should check both to see if gender makes a difference in the current language [18:33:25] So I have to do the same thing for each message that uses GENDER? [18:33:43] Sure seems like it [18:34:25] But function can only return one thing right? So if there's multiple messages, do I need to pass the message as a parameter? [18:35:34] You are checking whether you need to grab gender from api _at all_. [18:35:47] So if any message, even if it is just one, requires you to know gender [18:36:00] you grab the message [18:36:16] Boolean OR comes into handy [18:41:00] So in order to make that function applicable for everything, wouldn't I need to do something like this? https://dpaste.de/EBZZ I'm not sure if I'm understanding you correctly. [18:42:20] Hydronium: So in order to make that function applicable for everything, wouldn't I need to do something like this? https://dpaste.de/EBZZ I'm not sure if I'm understanding you correctly. [18:44:15] No [18:44:27] needGender is not passed any parameters when it is called [18:44:46] it is called as-is and its return value is used to determine whether or not gender is requested via API [18:44:55] Hmmm. I'm confused. [18:45:03] So right now, it only does it for one message. [18:45:22] Ok, this is how you can make it work [18:45:42] Turn the current needGender (with your added parameter) into a helper function with some other name [18:45:56] Add a new needGender that runs the helper function for every message that has {{GENDER}} in it [18:47:59] That way you don't have to have ridiculously long boolean line that has return male !== female || male !== unknown || female !== unknown || male !== female || male !== unknown || female !== unknown....; [18:48:26] the new needGender should return true if the helper function returns true for _any_ of the messages that have {{GENDER}} [18:48:52] 13:45 So right now, it only does it for one message. -- That is the issue [18:49:03] The goal of the modification is to have it do the check for all messages applicable [18:49:12] So this is the first step. https://dpaste.de/TMje [18:49:22] Create that function. [18:49:48] Looks good. I [18:50:16] I'm not sure if that is the place to put it, because I am not very experienced [18:50:16] So do I loop through every message in en.json? [18:50:25] but if someone wants to move it later it should be trivial [18:50:36] You should probably loop through a list of message that you know require gender [18:50:59] I only need one needGender function right? [18:51:36] Why would you need more than one? [18:52:01] Earlier, you said add a new needGender. So I wasn't sure. [18:52:37] Actually, scratch the new function part [18:52:40] ugh, I am terrible at this [18:52:49] Ok. [18:52:53] Make needGender have a list of messages that require {{GENDER}} [18:53:06] Loop through the list and perform the check with male !== female || male !== unknown || female !== unknown [18:53:14] if that is true, then return true (which should break the list) [18:53:23] *should break the loop [18:54:04] You understand why this is necessary, correct? [18:56:30] Yes. Break the loop and call the other function with that message? [18:56:36] as the paramter. [18:57:47] No, when you return a value inside of a loop inside of needGender, it should break the loop and the whole function should return a value [18:58:12] The reason is, even if only one of the messages requires GENDER, then you need to grab the gender from the API [18:58:55] Gotcha. So it's more efficient. [19:00:30] Hydronium: This is what I have so far. https://dpaste.de/WCRs [19:00:54] Hydronium: That means, with this method, I don't even need a new function. [19:01:42] Hydronium: Wait, that's not right. How do you loop through a list in Javascript? I'm thinking in python. [19:02:59] for(int idx = 0; idx < array.length; idx++) { //do some junk [19:02:59] Hydronium: https://dpaste.de/AWO3 [19:04:42] Hydronium: Does that one seem right? [19:04:43] looks ok so far, except the int i = 0, len = whatever stuff is unnecessary [19:04:51] Hydronium: Why? [19:05:06] 14:03 for(int idx = 0; idx < array.length; idx++) { //do some junk [19:05:53] Hydronium: So like this? for (i = 0, , i < needGenderMessages.length; i++) [19:06:00] something like that [19:06:11] Hydronium: So no need for the other function. This one does it all. [19:06:14] yes [19:07:02] Hydronium: So in my en.json file, do I need to change "multimediaviewer-text-embed-credit-text-tbls": "\"$1\" by $2. Licensed under $3 via $4", to "multimediaviewer-text-embed-credit-text-tbls": "\"$1\" by {{GENDER:$2}}. Licensed under $3 via $4",? [19:07:28] {{GENDER}} is what you use when you have pronouncs. [19:07:55] e.g. "User:Sn1per uploaded this piece of junk. [He/She/They] licensed it to be Public Domain" [19:08:08] In which case you would use {{GENDER}} [19:08:20] You wouldn't need {{GENDER}} if you are inserting the name itself [19:08:28] because it wouldn't do anything. You aren't using any pronouns [19:08:45] Ok. So the GENDER is for the other languages besides English? [19:08:57] In the messages I am changing? [19:09:00] Yes, other languages also have pronouns, but some are gender-neutral [19:09:06] Gotcha. [19:09:16] The good folks at translatewiki.net will handle that [19:09:21] So now. My provision is done. And I have successfully imported everything. [19:09:44] How do I continue my test from earlier? [19:10:20] Go to your user preferences and set your gender for "Admin" [19:10:52] Done. [19:11:39] hold up, let me make sure I'm saying the right stuff [19:14:11] ok [19:16:20] Hydronium: I need to go for a 1-2 hours after I test this soon. Then I'll finish this stuff up. [19:17:25] Hydronium: Can I test this later? Or will you be busy then? [19:17:39] well, I was going to say add Template:Information to your page with you as the uploader [19:17:47] but I'm not sure if that will work [19:18:09] Hydronium: Well. I'll try that later. Hopefully, you'll still be here. Thanks for all your help. :) [19:18:13] k [19:18:32] +marktraceur: Thanks for all your help as well! Really appreciate it. [19:23:02] I have a feeling I told him entirely the wrong stuff [22:52:57] Hydronium: Hey! Are you still there? [22:53:07] sup dawg [22:53:11] I just woke up from a nap [22:54:05] Hydronium: Should we test this code? [22:54:11] Go for it [22:54:52] Hydronium: So. What were you saying when I left? [22:55:28] I have no idea if I'm doing this properly [22:55:47] +marktraceur: Do you know how to test this properly? [22:55:49] Maybe add Template:Information to a file and try out the field you're testing? [22:57:27] Do I just edit the file to do that? [22:57:31] Yes [22:58:12] Do I just put Template: Information in the file? [22:58:21] Once I click edit? [22:59:42] I just made a link like this once I click edit. [[Template:Information]]. Is that right? [23:01:44] Hydronium: I just made a link like this once I click edit. [[Template:Information]]. Is that right? [23:02:35] No, you need to substitute it [23:02:39] {{Template:Information}} [23:02:44] And add information in the parameters [23:02:52] you can find out instructions on the Commons Template:Informatino doc page [23:04:26] Hydronium: I do it like this? https://dpaste.de/obfF [23:04:56] MtDu: Hold up, which parameters are you testing? [23:07:01] Hydronium: I think author, url, permission (aka license info.), and the name of the file (I don't see this parameter available on the webpage doc). [23:07:51] Hydronium: Those are the parameters in the message I'm testing. [23:08:16] Ok, the template looks good so far [23:08:23] be right back [23:08:30] Ok [23:08:42] Fill out the parameters and they should appear in the right places in mediaviwer [23:09:01] So I just do it like that? https://dpaste.de/obfF [23:09:25] What about the parameter for the name of the work? Or do they not have one for that. [23:09:50] MtDu: You should be able to look at just about any file on Commons and use the {{Information}} call from it [23:10:04] But yeah, that's right [23:10:21] I'm not sure I'd ever use the word "proper" to refer to how we test things in MediaWiki though [23:10:36] +marktraceur: So is there not a paramter for the name of the work? [23:11:35] Not exactly, no. That's just the filename. [23:12:59] +marktraceur: Right now, I am editing the image page, and this is what I have. https://dpaste.de/usqa I don't know what to put for permissions. [23:13:33] Uhhh [23:13:48] Take out {{Creator:Admin}} and put in [[User:Admin]] [23:13:53] Don't need permissions probably [23:14:43] +marktraceur: Ok. Is that all I need to add? [23:15:31] +marktraceur: According to the page, you can add license info like this. Ex. | Other fields = {{Credit line |Author = © John Doe | Other = Wikimedia Commons |License = CC-BY-3.0 & GFDL}} [23:19:44] (03PS1) 10Ori.livneh: Stop calling ApiQueryBase::titleToKey() [extensions/TimedMediaHandler] - 10https://gerrit.wikimedia.org/r/260220 [23:22:14] (03PS2) 10Ori.livneh: Stop calling ApiQueryBase::titleToKey() [extensions/TimedMediaHandler] - 10https://gerrit.wikimedia.org/r/260220 [23:28:15] +marktraceur: Do I need to add that? [23:34:32] Don't worry about it [23:34:38] MMV should stil work [23:36:09] I get a huge amount of html and an error when I click MMV [23:37:09] This is what I have right now. https://dpaste.de/S97L [23:45:08] Hydronium: I'm not sure why I get this huge amount of html and error when I click MMV [23:53:41] Hydronium: Also, I was thinking about the needGender function. If none of them return True, then shouldn't it return False? [23:54:24] tgr: I'm not sure how to test my code. Could you walk me through it? [23:58:40] I get this error when I try to run MMV, even without the Template Information stuff in the page. https://dpaste.de/5A0q