*** menesis has quit IRC | 02:02 | |
*** th1a has quit IRC | 02:35 | |
*** yvl has joined #schooltool | 10:02 | |
*** menesis has joined #schooltool | 10:48 | |
*** th1a has joined #schooltool | 13:19 | |
*** menesis has quit IRC | 13:45 | |
*** menesis has joined #schooltool | 14:53 | |
*** mibofra has quit IRC | 15:13 | |
*** mibofra has joined #schooltool | 15:15 | |
*** replaceafill has joined #schooltool | 15:26 | |
*** mibofra has quit IRC | 15:27 | |
th1a | hi replaceafill, menesis, yvl. | 15:30 |
---|---|---|
replaceafill | good afternoon | 15:30 |
yvl | good morning /afternoon | 15:30 |
*** mibofra- has joined #schooltool | 15:32 | |
th1a | So I got an email Friday evening from David Ally explaining he needed to have a working Schooltool ready for a meeting this morning. | 15:32 |
th1a | Always an adventure. ;-) | 15:32 |
th1a | I sent an email about a locale issue he ran into. | 15:32 |
th1a | Any thoughts about this? | 15:33 |
th1a | Or maybe we need to wait for menesis. | 15:33 |
th1a | To be clear, I don't let myself get stressed over David's last minute requests. | 15:33 |
menesis | hello. | 15:33 |
menesis | I saw the question and looked into it last night | 15:34 |
menesis | but did not quite understand what's wrong | 15:35 |
th1a | Well, SchoolTool didn't start. | 15:36 |
th1a | Maybe the locale issue was hiding the real problem in the log because we still needed to blow away the db for SchoolTool to work. | 15:37 |
menesis | it does work for me with lang en_NG in schooltool.conf | 15:38 |
menesis | there is only one string translated differently (Journal -> Register) | 15:38 |
th1a | It would have been set up as a locale on his laptop. | 15:39 |
menesis | maybe the locale is not generated in the system? but it works for me with other locales I don't have generated | 15:40 |
th1a | Generated? | 15:41 |
th1a | I don't actually understand locales very well. | 15:42 |
menesis | there is a list of supported locales on the system | 15:43 |
menesis | that you select during install | 15:45 |
th1a | OK. | 15:45 |
menesis | but as I said translations work for me even for "unsupported" locales | 15:45 |
menesis | so I'm not sure what the problem is | 15:46 |
th1a | Unsupported by your system. | 15:47 |
th1a | OK... | 15:47 |
th1a | Can you suggest something for him to try? | 15:48 |
menesis | I can add "lang zz_ZZ" to schooltool.conf and it still starts and can be selected :-/ | 15:49 |
th1a | Should I have him send you a full log? Just reinstall? rund something to re-generate something? | 15:50 |
menesis | I can suggest "sudo dpkg-reconfigure locales" | 15:51 |
th1a | OK. Let's try that! | 15:51 |
menesis | or "sudo locale-gen en_NG" | 15:51 |
menesis | but since I cannot reproduce anything like that, not sure what would help | 15:52 |
menesis | complete log would be useful | 15:52 |
th1a | paste.log? | 15:52 |
th1a | He is going to be setting up several production servers, so I'd just rather not shrug the whole thing off at this point. | 15:53 |
menesis | nowadays it is error.log | 15:54 |
th1a | OK, on a similar note, do you have any idea replaceafill where the old niepa server even is? | 15:54 |
th1a | If it is still... someplace? | 15:55 |
replaceafill | dev.schooltool.org | 15:55 |
th1a | OK, thanks menesis. | 15:55 |
replaceafill | but it doesn't start iirc | 15:55 |
replaceafill | i tried several months ago | 15:55 |
replaceafill | when i formatted the vps | 15:55 |
th1a | OK. | 15:55 |
th1a | Thanks menesis. | 15:55 |
th1a | I'll send David an email. | 15:56 |
th1a | Well, I guess you might as well report menesis. | 15:56 |
menesis | I have finished fixing intervention errors | 15:57 |
menesis | and all its tests now pass | 15:57 |
menesis | made a release | 15:57 |
* menesis reminds himself: copy intervention to precise | 15:58 | |
menesis | there is a test failure regarding contacts | 15:59 |
menesis | and names in the Students group are not visible to teachers, even if teacher can see it elsewhere | 15:59 |
menesis | i fixed the test differently, but haven't found a solution to this particular issue | 16:00 |
menesis | then, got a question about newest schooltool not starting | 16:00 |
menesis | answered with a workaround | 16:01 |
menesis | but its a fresh db, so delete the database is enough | 16:01 |
menesis | fixed the offending evolution script | 16:01 |
th1a | Was it like this: 677, in openDB | 16:02 |
th1a | db = db_configuration.open() | 16:02 |
th1a | File "/usr/lib/python2.7/dist-packages/ZODB/config.py", line 127, in open | 16:02 |
th1a | **options) | 16:02 |
th1a | File "/usr/lib/python2.7/dist-packages/ZODB/DB.py", line 459, in __init__ | 16:02 |
th1a | temp_storage.tpc_vote(t) | 16:02 |
th1a | File "/usr/lib/python2.7/dist-packages/ZEO/ClientStorage.py", line 1098, in tpc_vote | 16:02 |
th1a | return self._check_serials() | 16:02 |
th1a | File "/usr/lib/python2.7/dist-packages/ZEO/ClientStorage.py", line 929, in _check_serials | 16:02 |
th1a | raise s | 16:02 |
th1a | ZODB.POSException.ConflictError: database conflict error (oid 0x00, class persistent.mapping.PersistentMapping, serial this txn started with None, serial currently committed 0x03a350f58327cb22 2013-12-09 05:41:30.739557) | 16:02 |
th1a | David also got that this morning. | 16:03 |
menesis | no | 16:03 |
menesis | KeyError: 'schooltool.app.ApplicationPreferences' | 16:03 |
menesis | ConflictError... I don't think we can do anything about that | 16:04 |
menesis | a little piece of data entered might be lost | 16:04 |
menesis | or something | 16:04 |
menesis | I do sometimes see conflict errors but they just litter the logs, no visible problem | 16:05 |
th1a | Ah, yeah. | 16:05 |
menesis | "oid 0x00" looks suspicious | 16:06 |
menesis | I have a few emails to reply | 16:07 |
th1a | OK. | 16:08 |
menesis | then I plan to commit my unfinished jquery-1.10 upgrade for Douglas to see | 16:08 |
menesis | then revive another unfinished task, zope.html fixes and move to ckeditor | 16:09 |
* menesis done with report | 16:09 | |
th1a | OK. Thanks menesis. | 16:10 |
th1a | yvl? | 16:10 |
yvl | ok... | 16:10 |
yvl | cleaned up the code a bit, pushed to lp, sent link to replaceafill | 16:11 |
yvl | started working on temporal relationships for contacts | 16:11 |
yvl | nearly done | 16:11 |
yvl | they were really duplicating the functionality, just in a different way | 16:12 |
yvl | also loosening up / fixing security along the way | 16:12 |
yvl | other minor "API" fixes | 16:12 |
yvl | what's left... | 16:13 |
yvl | port manage contacts view to temporal rel. UI | 16:13 |
yvl | and evolution | 16:13 |
th1a | you and/or replaceafill need to make levels temporal for people. | 16:13 |
yvl | replaceafill, are you up for it? | 16:14 |
replaceafill | sure, it'll help me understand the code better | 16:14 |
replaceafill | i was thinking more on the gradebook | 16:14 |
replaceafill | but this sounds good | 16:14 |
replaceafill | th1a, we're setting the level in the person add/edit forms? | 16:15 |
th1a | If it made it much easier, it could be a separate form. | 16:15 |
th1a | Hm... | 16:15 |
th1a | Generally you're going to initially set it when you create the person and then do mass-promotion. | 16:16 |
th1a | Only occasionally would you manually change that for someone. | 16:16 |
th1a | So it wouldn't necessarily need to be in the regular edit info form. | 16:16 |
th1a | But you would want to set it when you added someone. | 16:16 |
replaceafill | ah ok | 16:17 |
th1a | Probably a separate "Promote" link would be fine for updtes. | 16:17 |
th1a | updates. | 16:17 |
replaceafill | it's one level per person, correct? | 16:17 |
th1a | Yes. | 16:17 |
replaceafill | yvl, i have a question about this type of relationships | 16:18 |
yvl | :D | 16:18 |
yvl | so no | 16:18 |
yvl | not one level per person :D | 16:18 |
replaceafill | i mean, a person will be associated to one level only :) | 16:18 |
yvl | I think we'll end up with relationships to all levels a person has taken, is learning, or is enrolled to | 16:18 |
yvl | but states will be pre-enrolled, active and completed | 16:19 |
yvl | or similar | 16:19 |
yvl | the way to think about such relationships is | 16:20 |
replaceafill | oh, so the "temporal" part doesn't mean "we're going to remove it at some point" | 16:20 |
yvl | yes | 16:20 |
yvl | right | 16:20 |
replaceafill | it means "from this date to this date" | 16:20 |
replaceafill | correct? | 16:20 |
yvl | yes | 16:20 |
yvl | well, strictly speaking | 16:20 |
yvl | it means "from this date forward" | 16:20 |
replaceafill | ah ok | 16:20 |
yvl | 2012-07-01, Person -> level1, "pre-enrolled" | 16:21 |
yvl | 2012-09-01, Person -> level1, "enrolled" | 16:21 |
th1a | I thought this would be a good way to get replaceafill up to speed. | 16:21 |
yvl | 2013-07-01, Person -> level1, "graduated" | 16:21 |
yvl | so if it is 2012-08-15 today, the person will be displayed as pre-enrolled across the system | 16:21 |
yvl | once date hits 09-01 he becomes enrolled | 16:22 |
yvl | you can also do things like "consider him enrolled from two months ago" | 16:22 |
yvl | also you can query "return all levels completed" | 16:23 |
yvl | or "all levels completed by 2010-05-07" | 16:23 |
yvl | "people not completed level 4 by 2012-04-12" | 16:24 |
yvl | and so on | 16:24 |
yvl | btw, I'll push some minor API changes today | 16:24 |
replaceafill | yvl, could you point me to the query machinery specifically? | 16:24 |
yvl | it's wildly undocumented | 16:24 |
th1a | Well, replaceafill is going to have to know how it works. | 16:25 |
yvl | it's done via relationship properties | 16:25 |
yvl | person.sections.on(today).any(ACTIVE) | 16:26 |
replaceafill | so i could do person.levels.something? | 16:26 |
replaceafill | ah | 16:26 |
yvl | those calls return the relationship property with filtering options | 16:26 |
replaceafill | got it | 16:26 |
yvl | by default, they query active, today | 16:26 |
yvl | you can also do person.sections.all().on(today) | 16:26 |
yvl | what else.. | 16:27 |
yvl | you can look at SectionMemebersStartUp for example | 16:27 |
yvl | SectionMemeberStatesStartup | 16:27 |
yvl | temporal states are configurable, so that inits defaults | 16:28 |
yvl | states are composed of two things | 16:28 |
yvl | meaning and code | 16:28 |
yvl | meaning is a string (of letters) | 16:28 |
yvl | for querying withing app | 16:28 |
yvl | you'll see most of them hard-coded | 16:29 |
yvl | ACTIVE+COMPLETED | 16:29 |
replaceafill | active+completed?!?! | 16:29 |
replaceafill | :D | 16:29 |
yvl | ('a'+'c') | 16:29 |
replaceafill | nice! | 16:29 |
yvl | ACTIVE -> display; not invalid/deleted/hidden | 16:29 |
yvl | COMPLETED -> for reports | 16:29 |
yvl | states.describe(ACTIVE+COMPLETED, _('SOMETHING')) | 16:30 |
yvl | adds this value to a dropdown | 16:30 |
yvl | that users select when they add new codes | 16:30 |
yvl | code is something arbitrary | 16:30 |
replaceafill | what's the last letter in: | 16:30 |
replaceafill | states.add(_('Pending'), INACTIVE, 'p') | 16:30 |
yvl | that's the code | 16:30 |
replaceafill | the code for "pending" | 16:30 |
replaceafill | not for inactive | 16:30 |
replaceafill | right? | 16:30 |
yvl | yes | 16:30 |
yvl | and user can add | 16:31 |
yvl | "Even More Pending", INACTIVE, 'pm' | 16:31 |
*** mibofra- has quit IRC | 16:31 | |
yvl | via UI | 16:31 |
*** mibofra has joined #schooltool | 16:31 | |
yvl | and that should be exported to XLS and so on | 16:31 |
yvl | (not done yet) | 16:31 |
yvl | also, when clerks add persons to a section | 16:32 |
yvl | they see the Pending , Withdrawn titles | 16:32 |
yvl | or any their admins added | 16:32 |
yvl | I think that covers the basics | 16:33 |
replaceafill | so we'll need "level-membership" states for my work, right? | 16:35 |
yvl | yes | 16:35 |
yvl | oh right :) | 16:35 |
yvl | also, use TemporalURI for relationship type | 16:35 |
yvl | see app/membership.py | 16:35 |
yvl | also | 16:36 |
yvl | course/browser/section.py | 16:36 |
yvl | FlourishSectionLearnerView(EditPersonTemporalRelationships) | 16:36 |
yvl | note app_states_name | 16:36 |
yvl | same as states in startup | 16:37 |
replaceafill | that's the link between the view and the type of relationships it affects? | 16:37 |
yvl | yes | 16:37 |
yvl | basically "use this code dictionary here" | 16:37 |
*** mibofra has quit IRC | 16:38 | |
yvl | oh | 16:38 |
yvl | also | 16:38 |
yvl | group/browser/group.py | 16:38 |
yvl | FlourishMemberViewPersons | 16:38 |
yvl | app_states_name is a property | 16:39 |
yvl | with hardcoded students | 16:39 |
replaceafill | ah, it can be dynamic | 16:39 |
yvl | yes | 16:39 |
replaceafill | as in flourishmemberviewpersons | 16:39 |
yvl | uh? | 16:40 |
replaceafill | quick question | 16:40 |
yvl | listening :) | 16:40 |
replaceafill | can you remind me what the .describe of state does? | 16:40 |
replaceafill | you add the state | 16:40 |
*** mibofra has joined #schooltool | 16:40 | |
replaceafill | with a i18n, "global code", "local code" | 16:40 |
replaceafill | sorry, not sure about the right terms to use :) | 16:41 |
replaceafill | and then you use describe | 16:41 |
replaceafill | with a different "global codes" combination | 16:41 |
replaceafill | i'm looking at SectionMemberStatesStartup | 16:41 |
yvl | ok | 16:42 |
yvl | these "global codes" are hard-coded in application | 16:43 |
yvl | as global variables in modules | 16:43 |
replaceafill | sure | 16:43 |
yvl | ACTIVE = 'a' | 16:43 |
yvl | when users configure new "local" codes with some title to explain them | 16:44 |
yvl | they have a dropdown of "meaning" | 16:44 |
yvl | and that dropdown is basically a list of global codes | 16:44 |
yvl | since "i" is not very informative to the user | 16:44 |
yvl | there's the .describe | 16:44 |
yvl | describe("i", 'Inactive') | 16:45 |
yvl | also, I wrote it so that we must describe all possible permutations | 16:45 |
yvl | ACTIVE | 16:45 |
yvl | ACTIVE+COMPLETED | 16:45 |
yvl | INACTIVE | 16:45 |
yvl | so on | 16:45 |
yvl | there should not be a lot of them IMHO | 16:46 |
yvl | also | 16:47 |
yvl | descriptions are per-dictionary | 16:47 |
yvl | ACTIVE in student enrollment is "Enrolled" | 16:47 |
yvl | ACTIVE for asset leader is something different | 16:47 |
replaceafill | ah | 16:47 |
replaceafill | got it | 16:47 |
replaceafill | same global code | 16:47 |
replaceafill | different meaning | 16:47 |
yvl | yes | 16:48 |
yvl | the descriptions will be used in few places really | 16:48 |
yvl | in dropdowns in School -> Membership States -> (edit some dictionary) | 16:48 |
yvl | when you want to add a new code/title for example | 16:49 |
yvl | and in temporal relationship edit views | 16:49 |
yvl | like edit section students | 16:49 |
yvl | instead of removing, we now have edit | 16:49 |
yvl | that shows a popup | 16:49 |
*** mibofra has quit IRC | 16:50 | |
yvl | and if there are historical changes to that person in that section | 16:50 |
yvl | there's a table | 16:50 |
th1a | OK... I'm going to have to go in 10 minutes, so maybe replaceafill should give me a quick report and then you guys can finish. | 16:50 |
yvl | sure | 16:50 |
replaceafill | th1a, well i just worked on Telly's story at the end of last week | 16:51 |
replaceafill | i'm able to convert the pdfs quicker now | 16:51 |
th1a | I've not heard back from her, so just hold off on doing more on that. | 16:51 |
replaceafill | sure | 16:51 |
th1a | It is a good skill to have in the toolbox. | 16:51 |
replaceafill | :D | 16:51 |
replaceafill | i guess it's a good time to start with the temporal work | 16:52 |
replaceafill | since i don't have much in the queue | 16:52 |
replaceafill | that's it i guess | 16:52 |
th1a | OK, I'll try to nail David down to his needs and actual timeline. | 16:53 |
th1a | I'm not going to drop everything until we know clearly what is going on. | 16:53 |
th1a | Well, and even then not necessarily drop everything. | 16:53 |
replaceafill | do you want me to take a look at the current niepa branch? | 16:54 |
replaceafill | i mean, try to make it start at least? | 16:54 |
th1a | Yeah... | 16:54 |
replaceafill | kk | 16:54 |
th1a | Poke at it a bit. | 16:54 |
replaceafill | sure | 16:54 |
replaceafill | will do | 16:54 |
th1a | OK. That should do it. | 16:55 |
th1a | Thanks guys. | 16:55 |
* th1a drops the bag of gravel. | 16:55 | |
replaceafill | thanks everybody | 16:55 |
replaceafill | ok yvl a few questions and i'll let you go :) | 16:56 |
yvl | thanks th1a | 16:56 |
yvl | see you Mon :) | 16:56 |
yvl | sure replaceafill | 16:56 |
yvl | also: https://code.launchpad.net/~justas-pov/schooltool/temporal4 | 16:56 |
replaceafill | you think we need a "levels" relationship for persons now? | 16:56 |
yvl | no evolution, but with hackily ported contacts | 16:56 |
replaceafill | or do you think we should handle it differently | 16:56 |
yvl | I would say yes | 16:57 |
replaceafill | i don't get the pending state for sections | 16:58 |
replaceafill | so i don't see it for levels either | 16:58 |
*** mibofra has joined #schooltool | 16:58 | |
yvl | it's like pre-enrolled | 16:58 |
replaceafill | it's like you're enrolled, but not quite yet.... | 16:58 |
yvl | yes | 16:58 |
yvl | frankly | 16:58 |
yvl | not sure if it's needed | 16:58 |
replaceafill | yeah, i'm trying to think of the use case in a regular school | 16:59 |
replaceafill | but it doesn't hurt anyway | 16:59 |
yvl | I can think of only one case actually | 16:59 |
yvl | when you want to add a student in the future | 16:59 |
yvl | you set him enrolled in say Oct 15 | 16:59 |
replaceafill | like for next year? | 16:59 |
replaceafill | ah | 16:59 |
yvl | and he is not active until Oct 15 | 17:00 |
replaceafill | got it | 17:00 |
yvl | but if you don't know the date... | 17:00 |
replaceafill | i keep forgetting the date handling part of this :D | 17:00 |
yvl | yeah | 17:00 |
yvl | it's a whole new dimension! :D | 17:00 |
replaceafill | how's that set btw? | 17:00 |
replaceafill | the date | 17:00 |
replaceafill | from the on() method? | 17:00 |
yvl | yes | 17:00 |
yvl | by default - today | 17:01 |
yvl | so the good old | 17:01 |
yvl | .add and .remove work | 17:01 |
*** basic` has quit IRC | 17:01 | |
yvl | also | 17:01 |
yvl | relationship links | 17:01 |
yvl | and relationship info | 17:01 |
yvl | (when you iterate section.members.relationships for example) | 17:02 |
yvl | have .state | 17:02 |
yvl | state is accessed via.... | 17:02 |
yvl | rel_type | 17:02 |
yvl | so for temporal relationships it will give one thing | 17:02 |
yvl | for simple relationships - another | 17:02 |
replaceafill | so suppose i want to iterate on section members that are... "enrolled" only | 17:02 |
yvl | same goes for relationship properties | 17:02 |
yvl | so for setting... check the contact/browser/contact.py | 17:04 |
yvl | of the branch I gave | 17:04 |
yvl | search for self.relationship.state.set( | 17:04 |
yvl | self.reationship is RelationshipInfo there | 17:04 |
yvl | an alternative is: | 17:04 |
yvl | IContactable(person).contacts.on(today).relate(some_contact, meaning=ACTIVE, code='a') | 17:05 |
yvl | now, on to your question :) | 17:05 |
yvl | list(section.members.any(ACTIVE)) | 17:06 |
yvl | or list(section.members.on(today).any(ACTIVE)) | 17:06 |
*** replaceafill has quit IRC | 17:07 | |
*** mibofra has quit IRC | 17:07 | |
*** basic` has joined #schooltool | 17:09 | |
*** replaceafill has joined #schooltool | 17:12 | |
replaceafill | :( | 17:12 |
replaceafill | it took me 5 minutes to realize i had been disconnected... | 17:13 |
replaceafill | yvl, what's the coded method for? | 17:14 |
replaceafill | oh | 17:14 |
*** mibofra has joined #schooltool | 17:14 | |
replaceafill | it's different from "meanings" | 17:14 |
*** mibofra has quit IRC | 17:14 | |
replaceafill | never mind :D | 17:14 |
*** mibofra has joined #schooltool | 17:15 | |
*** mibofra has joined #schooltool | 17:15 | |
yvl | :) | 17:16 |
replaceafill | and every filter method returns a new property back? | 17:16 |
yvl | btw, replaceafill | 17:16 |
yvl | yes | 17:17 |
replaceafill | got it | 17:17 |
yvl | ok | 17:18 |
* yvl is going home :) | 17:18 | |
yvl | unless more questions :) | 17:18 |
replaceafill | you were going to say something? | 17:19 |
yvl | and there may or may not be bugs | 17:19 |
replaceafill | "btw, replaceafill"? | 17:19 |
yvl | right | 17:19 |
yvl | links have shared state now | 17:19 |
yvl | and extra_info is moved there | 17:19 |
* replaceafill barely remembers what extra_info does | 17:20 | |
yvl | shared state is a dict, it is also catalloged | 17:20 |
yvl | it's for storing data on a relationship link | 17:20 |
replaceafill | like the type of contact, right? | 17:21 |
yvl | yes | 17:21 |
replaceafill | parent, guardian.../ | 17:21 |
replaceafill | got it | 17:21 |
yvl | now most of it is moved to temporal relationships | 17:21 |
yvl | type of contact also | 17:21 |
yvl | but if you need it in the future | 17:21 |
yvl | look for methods that return SharedInfo | 17:21 |
yvl | sorry | 17:21 |
yvl | SharedState | 17:21 |
yvl | link.shared_state | 17:22 |
yvl | you can use irelationshiplinks adapter to iter over links | 17:22 |
yvl | and do link.shared_state['special_school_data'] = 5 | 17:22 |
replaceafill | @property | 17:23 |
replaceafill | def extra_info(self): | 17:23 |
replaceafill | return self.shared_state['X'] | 17:23 |
replaceafill | is that 'X' on purpose? | 17:23 |
yvl | yes | 17:23 |
yvl | shared_state is a dict | 17:23 |
yvl | now 'X' and 'tmp' are used | 17:24 |
yvl | 'X' for extra info | 17:24 |
replaceafill | ah | 17:24 |
yvl | 'tmp' for temporal states | 17:24 |
replaceafill | ah, just saw the assignment a few lines above | 17:24 |
replaceafill | got it | 17:24 |
replaceafill | ok, i'll experiment with the branch | 17:25 |
yvl | sure | 17:25 |
replaceafill | and will try to do something with levels | 17:25 |
yvl | lemme know what you think | 17:25 |
yvl | it may be messy | 17:25 |
replaceafill | based on the sections examples | 17:25 |
replaceafill | thank you very much yvl | 17:25 |
replaceafill | oh | 17:25 |
replaceafill | you wont be around on wed? | 17:25 |
yvl | today is Monday | 17:26 |
yvl | yes, I will be there | 17:26 |
yvl | I thought today is Wed for some reason :S | 17:26 |
replaceafill | ah | 17:26 |
replaceafill | :d | 17:26 |
replaceafill | ok, thanks man | 17:26 |
replaceafill | see you wed | 17:26 |
yvl | see you soon | 17:26 |
*** menesis has quit IRC | 18:02 | |
*** timatic has joined #schooltool | 20:50 | |
th1a | replaceafill: ayt? | 21:28 |
replaceafill | th1a, i'm back | 22:06 |
th1a | Did you get a chance to try starting David's server yet? | 22:07 |
replaceafill | no, not yet | 22:07 |
*** menesis has joined #schooltool | 23:36 |
Generated by irclog2html.py 2.15.1 by Marius Gedminas - find it at mg.pov.lt!