#summary A collection place for team meeting agendas and resulting notes.
#labels agendas,meetingnotes,Importance-Useful

= Meeting Agendas and Call Notes =

The Melange developer team holds a weekly meeting via Skype conference each Monday at 17:30 UTC. This page serves as a collection point for meeting agendas and the notes resulting from each call.

= Latest Meeting Agenda & Call Notes =



= Past Meeting Agendas & Call Notes = 

<wiki:toc max_depth="2" />

== 17 Oct 2011 Team Conference Call ==
*Chaired by:* Sverre

*Notes taken by:* Akeda

  * Mario and Orcun were absent.
  * Akeda is working on participant dashboard and will add missing links.
  * Sverre won't able to attend to the All-Hands and has issue with his thesis.
  * Lennard and Madhu have been working a lot on GCI as seen on commit logs.
  * Leo will help Madhu and Lennie in case need to add more test.
  * Daniel will work on invites/requests and ranking over the next week.
  * Praveen is likely won't able to attend to All-Hands too, has some issue with his visa.

== 26 Sept 2011 Team Conference Call ==
*Chaired by:* Sverre

*Notes taken by:* Praveen

  * Mario, Madhu and Orcun were absent.
  * Akeda will work on the initial admin dashboard for GCI.
  * Sverre is still working on GCI Forms.
  * Lennard is working on GCI data conversion.
  * Leo still has some problem with the test utilities. He will work with Lennard to sort out the issue.
  * Daniel is still working on the GCI Profiles that include new template too. He was waiting for the generic template that Madhu was working on.
  * Praveen has his interview regarding visa scheduled for Thursday after being refused the first time.

== 19 Sept 2011 Team Conference Call ==
*Medium:* Skype

*Chaired by:* Sverre

*Notes taken by:* Orcun

  * Madhusudan, Daniel were not present. Praveen had connection problems on his device and couldn't attend the meeting properly.
  * Leo have finished base Django test case for GCI.
  * Lennard fixed some conversion tasks.There are some open issues blocking his works. He wrote an email to Madhu for them.
  * Akeda was busy with his school works and visa. He is going to go for the visa interview and will catch up after then.
  * Orcun is waiting for review of his patches. He is reading commit logs to understand the GCI.
  * Mario was busy with interview for job conversion after his internship with Google.
  * Sverre worked on documents and program stuff. But forms are not ready so they're not useful yet. He and Daniel will work on forms together.

== 12 Sept 2011 Team Conference Call ==

* Chaired by:* Sverre

* Notes taken by:* Akeda
  * Praveen, Leo and Madhu were absent.
  * GCI was nearly deadline. Sverre warned everyone to catch up his work.
  * Lennie has been working on template based on the mockup delivered by ED. He will be working on the dashboard and student form.
  * Sverre will be working on document page, request/invite page and embedding calendar on timeline page.
  * Mario and Daniel will be started to put their hands on GCI, propbably, next week. 
  * Akeda was preparing his visa and waiting the response for interview schedule. He was assigned in the Phase V of GCI (admin dashboard).
  * Orcun will be working on the rest of the patches. He also busy with his visa and need to go to Istanbul for visa interview.

== 5 Sept 2011 Team Conference Call ==

* Chaired by:* Lennard de Rijk

* Notes taken by:* Praveen
  * Leo has completed the GCI Test setup and he can provide more helper functions in profile utils as the need arises.
  * Lennie was a bit involved in the paper work for US, so he has scheduled his time to work more on the task view the next day.
  * Madhu has finished the back end for the task edit page. He needs the front end to be delivered by EchoDitto to complete the view. He will continue to work on the task edit page during the week.
  * Sverre was unable to work on GCI as he needed the stuff yet to be delivered by EchoDitto. Lennard suggested him that he could work on the program edit page, mentor/admin invites/requests for GCI. Sverre agreed to work on it.
  * Daniel will work on student/mentor/orgadmin profile edit page.
  * Orcun did not attend the meeting.
  * Praveen and Akeda are currently working on to complete their rest of the patches.
  * Sriharsha Chillara, a new contributor introduced himself to the Melange community. The developers suggested him to read about GAE and Django.

== 29 Aug 2011 Team Conference Call == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Leo is working on profile utils for GCI. He will be able to finish most of it, if not all, before next Monday.
  * Madhu will continue working on the create task page for now.
  * Lennie should be able to do more with the task list soon.
  * A surprise gift was given to GSoC students.

== 15 Aug 2011 Team Conference Call == 

* Chaired by:* Leo (Chong Liu) <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Orcun finished Spreadsheet Export, will send all patches today, and start to work on Carol's issue. He plans to finish them before the end of gsoc. After gsoc, he will continue to work on other issues assigned to him after one week's break.
  * Praveen worked on testing gsoc.views.org_profile, profile_show, accepted_orgs, proposal_review and duplicates. He met some difficulties and will be discussing with Leo about them. Leo suggested him to correct all the pending tests and then submit them for review. After gsoc, he plans to implement functional tests and then work on buildbot.
  * Akeda revised his patch for account management (already sent to the milist) and program assigned for host (sent to Daniel). He is still working on generic iconic dashboard. Before GSoC ends, he will be delivering generic dashboard, so it can be used for GCI too. He will try to stay after GSoC if there's thing to deliver. Leo told him that there will always be something for him and other gsoc students.


== 8 Aug 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Akeda completed account management with the test, adding user as a host and generic dashboard. The changes, however, broke test_admin.py and test_dashboard.py. He will fix the tests before sending it for review.
  * Praveen tested gsoc.views.duplicates, worked on the access check functions, and added a few more tests to gsoc.views.org_profile and profile_show. He hopes to finish the tests for all the views by the end term.
  * Orcun worked on the feature of exporting an empty spreadsheet with "export list" button. After finishing the spreadsheet functionality, he will work on Issue 1239 and, if time allows, the document list picker for the student proposal page.


== 1 Aug 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Akeda is working on doc list, tests for UserEdit page, the function of uploading logos for organization, and clickable timeline wheel on the landing page. He moved the dashboard core to the soc.views.helpers and needs to rewrite the test, adds new tests for regular dashboard. He expects to complete the regular dashboard with iconic only by 6 Aug.
  * Praveen is working on testing org_profile, student_forms and profile_show views. He expects to finish them by tomorrow.
  * Orcun is one week behind schedule because of the difficulties posed by the cross-domain policy, which he eventually solved. Sverre suggests him to ask for help instead of spending too much time trying to solve it himself. Orcun will work on exporting lists this week. 


== 25 Jul 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Akeda missed this week's blog post and he will write it after the meeting. His patches are ready to be reviewed. For iconic dashboard, try his live instance at http://melange-iconic-dashboard.appspot.com/. For toggleable list, try http://melange-new-dashboard.appspot.com/. For uploadable org's logo, try http://melange-upload-logo.appspot.com/. He will register the test account to the last instance as well.
  *  Orcun is implementing SpreadSheet API methods over https protocol. He did not know how to make a token available to JS. Sverre suggested him to send the server side token to the user and then use it client side.
  * Praveen has not written this week's blog post and was late for the meeting. Leo will talk to him.


== 18 Jul 2011 Team Conference Call == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Lennie reminded Orcun of this week's blog post and asked him to be on time next week.


== 11 Jul 2011 Team Conference Call == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Praveen has almost completed logic tests and studied view tests with Madhu's help. He will try to complete the view tests by the final evaluations. Leo thinks he has made a good progress so far and there may be not many work for view tests since many views have already had tests. Leo will further discuss the project scope with Praveen after the meeting.
  * Orcun is on track according to Mario. Mario will review his JS code and Madhu will review his python code. Regarding one-way vs. two-way syncing, Lennie suggests keeping it one-way for simplicity for now.
  * Akeda pushed the code for admin dashboard, but forgot to post the JS part for rivew. He will do so after the meeting.
  * Selwyn improved the public task view to have forms to publish comments and to take actions based on the task status, retrieved the work submissions on the page, wrote view for creating and editing a task, and wrote the timeline helper for GCI. He will write tests and run the view locally. Madhu will help him with creating a new datastore. Madhu feels that his progress in this week was ok but he still has much to catch up.


== 4 Jul 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Praveen has sent several patches and made a big progress last week. Leo thinks that he can do a great project if he can continue the hard work.
  * Akeda has also sent several patches and is waiting for review. Daniel will review them later.
  * Selwyn corrected his patches with respect to reviews. He is currently working on task views. Madhu thinks that he is still behind the schedule. Madhu and Sverre will have a meeting with Selwyn after the conference call to discuss his progress and how to help him catch up.
  * Orcun could not attend the meeting due to his connection issues.


== 27 Jun 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Akeda has made the dashboard view and template ready to review. He is working on a view to trigger accept_proposal's task and will send the currently available code for review.
  * Orcun was planing two different proposal pages as he wrote in mailing list. He decided to start coding instead of thinking too much on it. For now, the user can only either choose tinyMCE or GDocs. The feature of allowing them to switch may be added in the future if needed.
  * Praveen tested soc.logic.tags and corrected his previous tests. He has spent much time on studying the code itself. He will discuss his project plan with Leo and update it by this Sunday with goals that are achievable by midterm.
  * Selwyn have written the RequestData for GCI, got it reviewed and committed it. He also wrote RedirectHelper, Access Checker and sent them in for review. He has also written the site menus for GCI. He will be working on the task view and will complete it and get it running by tomorrow late or day after. After that he is planing to work on task_subscription view and views for org_application, org_profile and org_homepage. Sverre suggested him to communicate plenty with madhusudancs and Lennie about the views.


== 20 Jun 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Sverre repeated that GSoC students should write a blog post by every Sunday and tell any of their commitment before hand.
  * Progress of GSoC projects:
    * Akeda is working on admin dashboard. He demonstrated his work of colorbox on his online instance. It looks nice.
    * Praveen added tests for only two modules because he had spent some time on ICPC. He will focus on his project this week.
    * Selwyn has committed the GCIProfile and GCIStudentINfo models and is writing a script to convert GCIStudent data to GCIStudentInfo. Lennie thought Selwynis 4 weeks behind schedule. Lennie, Madhu and Sverre suggested Selwyn to communicate more and try to catch up.
    * Orcun finished oauth but he will make some modifications later. Madhu will review his code. 


== 13 Jun 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Sverre stressed that GSoC students should write a blog post at least a day before the conference call every week.
  * Developers will have a meeting with EchoDitto regarding new UI delivery sometime this week.
  * Progress of GSoC projects:
    * Praveen wrote tests on soc.logic.accounts and dicts and sent them to the list for review. Leo will review them these two days. Praveen is behind the schedule and will work hard to catch up.
    * Akeda is working on admin dashboard and will post initial code for admin dashboard next week. Carol wants to be able to choose different options while staying on the same page. Sverre suggested Akeda to use AJAX request to do the trick. Akeda will focus on admin dashboard and hopes to finish it before mid term, but this will depend on the requirement.
    * Selwyn will write a blog post; Lennie and Madhu will each review one patch of Selwyn. Madhu thinks that Selwyn may not be able to meet the deadline and he will jump in if necessary.
    * Orcun is working on gdata and OAuth Roundtrip. Madhu will review Orcun's Python code and Mario will ask Orcun about his blog post.


== 6 Jun 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu) with help from Praveen and Akeda <br/>
  * Madhu is working on survey. He has emailed his progress to the list and will talk to Mario about the implementation of javascript for survey. The EST to finish it is 1 Jul. 
  * Progress of GSoC projects:
    * Praveen is working on the online test runner. Sverre suggested him not to waste too much time on it and to start to write tests ASAP. Leo agreed with Sverre. 
    * Orcun was busy with his exams so he missed writing blog posts. He suggested integrating OAuth roundtrip, which Sverre thinks of a good idea. He had encountered some problems early on, e.g. gae unicode problem, but he has sorted them out.  
    * Akeda is working on admin and regular dashboard's improvement. Sverre suggested using ajax to fetch different pages of dashboard. He will implement list and ask Mario questions about the list code.
  * Suggestions: 
    * Sverre suggested ccing mails/questions to the list unless it is private so that others can know what's going on as well. 
    * Selwyn was not present. Sverre asked his mentors (Madhu and Lennie) to tell him to be more punctual. 

== 30 May 2011 Team Conference Call == 

* Chaired by:* None (call cancelled) <br/>
* Notes taken by:* All <br/>
* Edited by:*  Leo (Chong Liu)<br/>
  * Lennie fixed Issue 1244, continued working on the admin functionality with regards to survey results, and expect this to be finished before next call. He has also reviewed patches from Selwynn, but had no response yet.
  * Sverre started on converting previous year data and ran into old StudentInfo entities that need to be converted to GSoCStudentInfo entities (and have their references updated). 
  * Madhu reviewed the patch written by Selwyn and wrote a detailed reply to ED about the pages that need UI for GCI. He has also resumed the work on surveys form data recording, but has not proceeded much because of the travelling. He has informed others that he has only limited time during the week during All-hands. 
  * Leo had a meeting with Praveen today. Praveen has made some progress, done some useful research on online/web-based test runners but hasn't finished all planned work due to family matters. Because of the time restriction of GSoC, Leo suggested him to either focus on and complete the test runner within this week or move on to testing and treat the test runner task as a side project. As we have seen, Praveen chose the former :-). 
  * Progress of GSoC projects: 
    * Praveen did some research on web-test runners. He studied the code of gaeunit and figured out the magic of how they actually do it. He will spend this week on implementing our own online test runner and after that start adding the unit tests. There are some issues in implementing it because of the restrictions imposed by GAE. 
    * Orcun is working for exams. He will be working on his project between 3-6 June and then study for exams again till June 10. He is aware that he needs to write a blog post. 
    * Selwyn got his patches reviewed, made the suggested changes again and then sent them to the list for review again.The common fields to GSoCProfile and GCIProfile are moved to role.Profile and grade field in GCIStudentInfo to role.StudentInfo. He also modified role_conversion to convert GCI roles and update references for GCITask. 
    * Akeda discussed the design and requirement for enhanced administration and regular dashboard. He has provided the revised mockup for Updated admin dashboard page, withdrawing or approving students via admin dashboard, proposed solutions for crowded list on regular dashboard, and participants locations on admin dashboard with clusterer map. 


== 26 May 2011 Team Conference Call == 

* Chaired by:* Lennard de Rijk <br/>
* Notes taken by:* all <br/>
* Edited by:*  Leo (Chong Liu)<br/>
  * Sverre will be back on the 5th of June and will likely help out Madhusudan who is currently focusing on Surveys. There is no ETA yet for surveys but Madhu will update us once he gets started again. 
  * Progress of GSoC projects:
    * Akeda is working on redesigning dashboard. Lennie reminded him that there are two dashboards that Carol is faced with. One allows administrative functionality like sending out reminder emails while the other represents not only Carol's role as a Organization Admin for GOSPO but also gives more information than the regular dashboards for other users.The focus should be on improving the usability and functionalities that are exposed to Carol in her daily job as Program Administrator. After the meeting, he emailed Carol to discuss the design of Carol's dashboards.
    * Praveen is about one week behind his schedule due to his exams etc. He had a meeting with Leo this Wednesday. He will work on an online test runner suggested by Leo for his view task and will also work on testing one logic module, soc.logic.allocations this week. Lennie noted that the logic.models modules will be removed so no need to test them. Focus should be on the newly written code. 
    * Orcun could not attend the meeting because he got confused with the meeting time and assumed 19.30 CEST to be 19.30 UTC. He has added required libraries for GData APIs to Melange and fields for storing OAuth related fields. His project has not progressed as he had planned, so he will modify his schedule on his project wiki page accordingly. Furthermore, he will not be able to work much because he have exams before 10 June.
    * Selwyn has written GCIProfile and GCIStudentInfo models and the role conversion script which also updates references in the specified models. By this weekend, he will be moving list generator from GSoC module to the core, fixing necessary imports, and writing the GCI specific RequestData object. 

== 16 May 2011 Team Conference Call == 

* Chaired by:* Daniel Hans <br/>
* Notes taken by:* Lennard de Rijk <br/>
  * Selwyn will write blogpost and wiki page after call, due to personal issues. Akeda and Orcun made a wiki page. 
  * Daniel and Akeda will meet with Carol on Wednesday using Skype to brainstorm about their project.
  * Orcun is working on his view and struggling with the data seeder.
  * Leo had a meeting with Praveen this morning, Leo has asked him to put up the blogpost and wiki page this morning. They worked out a timeline.
  * Student's TODO List:
    * Create the blogpost summarizing last week today.
    * Have a call with your mentor this week, most of us are in PDT time zone.
    * Put a link to your GAE instance on the wiki page (and blog if possible)
    * Don't forget to make your next blogpost before the next meeting.
    * Get ready to start coding!

== 9 May 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Praveen is busy with his exams and will be free after this Friday.
  * Selwyn was working on asynchronous file upload for the tax forms, but he met some problems with jQuery. He will try to fix them and will ask for help if he cannot himself.
  * Orcun had some style problems with his testing code. Lennie and Sverre gave him some advice.
  * Lennie worked on tests and will work on survey.
  * Madhu fixed one issue and will work on ecodito delivery and set up a meeting with Selwyn.
  * Mario is busy with his job and studying for his last exam.
  * Leo is busy with his thesis.
  * Some advice and to-do list for GSoC Students:
    * Set up and run an online GAE instance before Thursday with your "View" from the first week. 
    * Write a blog post about it (and other work you've done) before next Monday so it can be reviewed before our conference call.
    * Create a wiki page on Melange wiki for recording the progress of your project [0].
    * Plan a meeting with your mentor and add notes to your OWN project wiki page.
    * Send your code to our mailing list for review before committing them.
    * Follow our python programming style [1]
  * [0] http://code.google.com/p/soc/wiki
  * [1] http://code.google.com/p/soc/wiki/PythonStyleGuide 

== 2 May 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * To-do list for GSoC students:
    * Set up an online instance and get it running.
    * Create a new view, hook it up, make it do something interesting, and show it off online during the conference call next week.

== 27 Apr 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * This year's GSoC Students first introduced themselves.
  * Orcun is from Turkey and had a party to celebrate GSoC yesterday.
  * Praveen's mic didn't work, so he has not introduced himself.
  * Selwyn is from India and very excited about being accepted as a GSoC student.
  * Akeda is from Jakarta Indonesia.
  * All Melange developers and Carol then introduced themselves as well.
  * Some advice for GSoC Students:
    * Try to work in day one and Sverre will add their google accounts to the committer list in order to ensure their code committed.
    * Write a blog post on http://melange-dev.blogspot.com/ every week at least hours before the conference call which normally takes place at 18:30 GMT/BST every Monday. They can introduce themselves and their projects in their this week's blog.
    * Contact their mentors regarding their projects.
    * Ask for help when they get stuck. 

== 20 Apr 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * All submitted GSoC proposals were discussed and scored. Mentors were assigned to accept proposals. 

== 13 Apr 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Submitted GSoC proposals were discussed.
  * Sverre asked about sorting columns by using jquery grid and adding version number in cookie.
  * Mario will implement filter change.
  * Madhu has finished the proposal page and will add one function for admin to send requests to Carol.
  * Daniel will do proposal conversion and work on showing the reviewer and their scores on the proposal page.
  * Lennie will work on the duplicate task. 
  * Sverre will work on custom columns and other features Carol needs. 

== 28 Mar 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Lennie will work on tasks of finding duplicate proposals.
  * Daniel will work on the conversion of proposals to projects.
  * Mario will check text editing.
  * Madhu will work on read-only version of profiles.
  * Sverre will add score to dashboard and remove ranking in favour of accepting or refusing.
  * Leo will add search page to the main menu. 

== 21 Mar 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Sverre solved a bug with setup tools and bootstrap. He also tried to lobby :-) us to test views by showing us how easy it is to do view tests now. He will add student proposals to dashboard by Wed.
  * Daniel is working on student proposal page and suggested that it should list student's email. He will work on request page, list org page, Student/Mentor/Org admin detail page, and link page as well as convert proposals to projects.
  * Madhu will work on org home page, current project, project detail and midterm survey.
  * Lennie will update task to calculate duplicates.
  * Leo will add the search page. 

== 14 Mar 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * EchoDitto introduced their designs of logos for Melange and asked our feedback. We will give them more feedback later this week.
  * Lennie was working on list and defined data for buttons together with Mario. He will complete the dashboard this week.
  * Daniel asked suggestions about url design for comments of proposals.
  * Madhu will work on org app.
  * Mario updated javascript, version and css and restructured javascript and jquery. He will work on list and css and will also fix column issues with firefox.
  * Leo added the usage of the seed functions to the testing wiki page. He will check broken tests, disable old views tests, and fix broken logic tests.  

== 7 Mar 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Ideas about the logo were discussed. Conclusion: it should be blue and close to Google logo.
  * Lennie is working on list and dashboard code.
  * Lennie and Mario will discuss adding the next starting position of fetch to ListsProtocol together.
  * Madhu is working on application forms and organization surveys.
  * Daniel is working on student proposals and review pages and will test the data conversion script.
  * Sverre will copy data for Daniel to conduct the test.
  * Leo finished up the seed function and sent a patch to the list for review and will add the usage of the seed functions to the testing wiki page. 

== 28 Feb 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Madhu is working on home page and will work on survey and site setting.
  * Daniel is working on forms and the conversion of data, and will work on the application forms.
  * Mario is updating the css and javascripts.
  * Sverre has written and shared the blog post and will ask EchoDitto about css for admin.
  * Leo was working on the seed function and will finish it up and send a patch to the list. 

== 22 Feb 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * The design of lists is discussed.
  * Lennie is working on dashboard.
  * Sverre and Daniel are working on forms.
  * Madhu suggested to use Django RequestContext that enables the reuse of python object and he will send a patch for review.
  * Leo is working on  the seed function. 

== 7 Feb 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Lennard is not present at the meeting, away to theater.
  * Lennard will look at Leo's comments on the Issue 534 patch within the next 3 days.
  * EchoDitto's Round 2 CSS Delivery is discussed.
  * The issue tracker is checked.


== 24 Jan 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * The CSS delivered by EchoDitto is reviewed and Sverre will send our feedback to EchoDitto.
  * Some issues with high priority are reassigned.
  * Leo found, with transactional updates of proposal scoring and review, the review didn't show up immediately after the request returns due to the fact htat the review is updated with taskqueue when he tried locally; Sverre and Lennie suggest using a message to inform the user of the situation. Later, Leo tried on his online instant and he found that the situation happens 2 out of his all trials (10+) whereas it's ALMOST 100% locally. 

== 17 Jan 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Madhu worked on fixing critical issues related to GCI.
  * Mario is discussing with his mentor to have Melange as 20% of his project and is working on some issues.
  * Leo has been working on making tasks transactional, which turns out to be a major pain due to entity groups. He I'll focus on Issue 534 instead for now and start to work on making tasks transactional after entity groups are integrated to our entities.
  * Lennard fixed the user_id issue, so now people will no longer have to email us to get their email address changed if they add a new one to their google accounti. He is going to work on the next issue assigned to him.
  * Daniel is working on integrating Pavel's work.
  * Mario suggests a big red danger sign and a big red "Don't do this" (which has already been implemented) or a 1x1 pixels button for confirmation after users' clicking "resign as a [whatever]" in order to make it harder for users to resign by mistake.
  * Madhu suggests updating the issue tracker with new milestones and shifting focus to GSoC.
  * Sverre will discuss with Carol about reproiritizing for GSoC 2011.
  * Sverre confirms that we will use new the UI delivered by EchoDitto for GSoC 2011 and will update our SDK to Appengine SDK 1.4.1. 

== 10 Jan 2011 Team Conference Call == 

* Chaired by:* Sverre Rabbelier and Lennard de Rijk <br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * CSS & HTML requirements for Melange are discussed.
  * Current issues with Milestone 2 or 3 are reviewed. 
  * To set GCI registration deadline to this Fri so that unregistered students can complete their registration.
  * To sovle the issue of being able to claim tasks after deadline and mark all those tasks claimed after deadline invalid.


== 6 Dec 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Current issues with Milestone 2 or 3 are reviewed.
  * The second revision of the SOC homepage designed by EchoDitto will be delivered soon.

== 29 Nov 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * The first revision of the SOC homepage designed by EchoDitto was viewed and disccused. The first impression is positive. 
  * Issues with Milestone 2 and 3 were discussed to make sure that they are completed in time.
  * Mario solved the firefox crash problem discussed last week. Well done! 

== 22 Nov 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Sverre fixed a problem due to the large number of tags entities have.
  * When users list or search GCI tasks, their firefox usually crashes because there are too many tasks currently (almost 700) and it would take a while to load all. Some possible solutions were discussed.
  * We should allow mentors to modify their tasks unless a student is working on it.
  * New issues were assigned.
  * Leo will talk with Felix about integrating data seeder with testing.


== 15 Nov 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * All issues have been triaged.
  * Sverre will fix issue 69, 219 and 967 before Friday. 
  * Lennard will work on issue 999 and 1000 this week. 
  * Madhu will fix issue 1003 by Wednesday/Thursday. 
  * Daniel will work on issue 986 and 988. 
  * Mario will work on CSV export, Google API key (with Sverre) and button reset (with Daniel), from Wednesday on. 
  * Leo will look at the use of the seed function to seed data for testing. 

== 18 Oct 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Lennard is back. Welcome back!
  * Issues in the issue tracker has been reduced to 82 issues from around 200 issues.
  * The official site of GSoC and GCI will move to http://www.google-melange.com/ from http://socghop.appspot.com/.
  * GCI has been announced and we are considering to participate, which will be further discussed in next week's meeting.

== 11 Oct 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Sverre talked about the current situation of our issue tracker and asked other developers about their future plans and availabilities. 
  * Daniel will work on the statistics module of GCI. He was very busy recently because he attended two weddings and he was also the best man for one of them. 
  * Mario will also work on integrating statistics into GCI. 
  * Felix will make his GSoC code ready for merging to the trunk. 
  * Leo will continue to work on adding more tests for soc.logic.cleaning module. 

== 4 Oct 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Sverre talked to Carol about how to create a GCI program which is only visible to developers and current issues in the issue tracker.
  *  Sverre will merge Leo's testing code added recently. 

== 27 Sep 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Sverre has set Milestones on all issues with high priority. Milestone0 issues need to be resolved before the start of GCI (15 Oct 2010), Milestone1 issues resolved before the start of accepting student students (29 Oct 2010), Milestone2 issues resolved before writing up things, Milestone3 issues resolved before next GSoC, Milestone4 issues would be nice to be resolved before next GSoC.
  * Sverre and Mario have Milestone0 issues which need to be resolved before the start of GCI (15 Oct 2010).
  * Madhu improved the FAQ of GCI.
  * Leo tested more functions in soc.logic.cleaning module. 

== 20 Sep 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Sverre finished triaging the bug queue and allocated them to developers.
  * He talked with Daniel, Madhu and Mario about their allocated issues during the meeting.
  * Carol asked about the response to the GCI testing invitation. At present, there are not a lot of responses. 
  * She will find the moderator of the old GHOP and hope to get more testing responses from the old GHOP communities.
  * Leo has fixed all style problems with the existing tests code.
  * He is working on the tests for soc.logic.cleaning. 


== 13 Sep 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  * Mario committed a fix to enable Update Quota button in Assign Task for GCI correctly. 
  * He can't work much until September 20 because exam is approaching.
  * Lennard, Daniel, and Sverre have had a bug queue triaging meeting, all issues up to 640 are triaged.
  * Sverre will finish triaging the bug queue before Friday since we have our initial meeting with EchoDitto (the UI redesign people) then.
  * Lennard worked on bulk CSV import for GCI, patch in progress. Early version is up on list and to be completed this week.
  * He is having fun in Sydney :). 
  * Leo has tried GCI, written testing report, added issues found to the project issue tracker and sent in one patch.
  * He has added information about GCI task to GCIUserManual.
  * He is fixing all style problems with existing tests code and will push them soon.
  * He will also clean up, commit and push the rest of the tests for soc.logic.cleaning. 
  * *Important notes:*
    * Google pays Sverre, Lennard, Daniel to work on Melange. Sverre works 20h/week; Lennard and Daniel both 10h/week.
    * Focus will be on "Improving the Carol experience", getting GCI ready for prime time, and making Melange faster.


== 30 Aug 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Daniel Hans<br/>
  # GCI: feature complete!
  # GCI: Update on the work done in the last week
  # GCI: Current rough edges
  # GCI: Testing time
  # Outcomes of Carol, Sverre and Daniel's meeting

=== Meeting notes 30 Aug 2010 ===

 * Mario has some technical problems and could not participate in the actual call, but he was around on chat
 * From our GSoC students we had Savitha on board. She will try to help with working on a user guide for GCI
 * Felix joined us at the end of the call, but he was not sure if he would have time.
 * Carol, Sverre and Daniel's metting had no outcome, as it had been put off
 * All GCI features are finally completed and in the repository
 * All modules were properly(?) renamed
 * GCI Ranking feature will be completed by the end of the week
 * There are still some minor problems with JavaScript
 * Madhusudan explained to us how to assign a task quota for organizations
 * New release should be deployed to Melange-dev
 * It would be better to do a backup before pushing a new release to socghop
 * The new release will be pushed on Friday
 * An email about the tests will be send over the weekend to the mentors lists and to the old GHOP mailing list
 * Testing period is to be scheduled for the next weekend
 * Swag will be offered to the most active testers for reports and especially for sending patches


== 23 Aug 2010 Team Conference Call == 

* Chaired by:* Madhusudan C.S<br/>
* Notes taken by:* Leo (Chong Liu)<br/>
  # Post GSoC: Any progress from GSoC students about their projects last week? What do GSoC students want to work on? Do they want to continue working on their projects or pick something else that interests them? What's the plan for this week? 
  # GHOP Plan: features from Madhu; work with Mario; work with Daniel 

=== Meeting notes 23 Aug 2010 ===
  * Attendance:
    * Madhu, Mario, Daniel and Leo
  * Update from Daniel:
    * Daniel will work on statistics module for GHOP and aim to complete it by Aug 31st.
  * Update from Leo:
    * Leo organized all meeting notes of last three weeks and then put them to the wiki meeting notes page.
    * He added more contents to the GettingStartedOnTesting wiki page, including information about Task queue service and gaetestbed MailTestCase and TaskQueueTestCase as well as more detailed guidelines on how to write tests for Melange and usage of each testing framework for logic, views, mails and task queues tests.
    * He created a patch for removing cron/job related modules from Melange and then sent it to the list for review.
    * He continued to work on testing soc.logic.cleaning and will finish it within this week.
    * He has also discussed with the author of gaetestbed about possible improvement of gaetestbed and will add his suggestions to the issues list of gaetestbed on github. 
    * He has also discussed with Felix about integration of data seeder and testing and is waiting for Felix' reply to Leo's proposal. 
  * Update from Madhu:
    * Madhu fixed several issues in GHOP module last week.
    * He introduced some features like "List My Tasks" for mentors and others.
    * Most of the fixes and features have already been pushed. More will come in this week since they need some clean up.
    * He proposed a new design for using "history" property in GHOP Tasks, has discussed with Lennard about it, and has sent a mail to Sverre and is waiting for it.
    * He works very hard to make Melange GHOP-feature complete by August 31st.
    * He will start working on the User Manual from this weekend since his part of GHOP is almost complete.
    * He is working with Mario for inline list-editing.
    * He will help Daniel if necessary for statistics module.
  * Update from Mario:
    * The clone for list editing is now in place.
    * Mario had some issues on getting buildout working. Sverre helped on finding the issue which was an incompatibility between buildout and folders whose names contain spaces. Another issue is lack of builtin Python 2.5 support in Lucid.
    * Today he committed some basic support for inline editing in the grid (just textboxes).
    * He will work on sending data back to server (all data or just dirty fields? Need to be decided) and including plugins (such as slider and datepicker) during the week. 

  * *Important announcement:*
    * The name of GHOP has been changed to Google Code In. 

  * *Action items:*
    * All the models and strings in the GHOP module must be renamed because of the change of GHOP name.
    * Daniel will meet Sverre and Carol tomorrow to discuss about triaging the renaming issues in the issue tracker and then re-prioritizing them.
    * Madhu would prefer to have a GHOP test week scheduled early in September since he was supposed to give an exam on October 3rd which has been rescheduled to October 13th because of his Melange commitments so availability during last weeks of September upto Mentor summit will be very poor. He asks Daniel to bring this issue of scheduling the GHOP test week when he meets Sverre and Carol tomorrow.
    * A project owner (Lennie or Sverre) needs to setup a project's clone instead of a user's clone for Madhusudan to commit list editing to the clone.

  * *Important notes:*
    * Madhusudan and Mario proposed that we should start conference call on time whatever the situation is (unless it's known that someone is coming in a few minutes) to avoid today's situation (the meeting ran late) happening again.
    * Next week's meeting will start at 17:30 UTC.
    * Leo won't be able to attend next week's meeting because next Monday is a British bank holiday. But he will put his update to the wave for next week's meeting notes which he will created in advance as well as organize all meeting notes and then put them to our wiki meeting notes page after the meeting.


== 16 Aug 2010 Team Conference Call == 

* Chaired by:* Daniel Hans<br/>
* Notes taken by:* Leo (Chong Liu)<br/>

=== Meeting notes 16 Aug 2010 ===
  * Attendance:
    * All present.
  * Update on GSoC projects:
    * Data Seeder: 
      * Latest version is up on http://sttwister-melange.appspot.com/seeder/home
      * He has configured a configuration sheet that does some seeding of more data, as an example it seeds sponsors, programs, organizations, mentors, students and student proposals.
      * While the data seeder works pretty well in the current form, there are still some unpolished areas like error reporting and handling, navigation and usability on the web interface, etc.
      * The web interface might be a bit cryptic and hard to use at this point. It's not obvious at all how to set up references and how to configure them. This part should definitely be properly documented and also some step-by-step guidelines in the web interface itself can't hurt, if not too space-consuming.
      * He is thinking a good way to learn to use it would be a screencast, but that would best wait until everything is polished enough.
      * He will also make it easy for tests to make use of the data seeder. He is currently discussing this with Leo so they can decide on the best approach. 
    * Document Editor:
    * Social Features:
    * Testing:
      * Leo has cleaned up, committed and pushed all the tasks testing code to his online clone.
      * After overcoming many difficulties, he managed to move the the gaetestbed and pymox modules to buildout dependencies and made his testing code ready to merge to the trunk.  
      * He also worked on adding test cases for soc.logic.cleaning with suggestion of Sverre. 
      * He has also uncovered a couple of bugs in the soc.modules.ghop.tasks.task_update module and sent a patch to the mailing list. Lennard was very kind to help him merge the patch. 
      * He has also uncovered one issue with his test code for soc.modules.gsoc.tasks.accept_proposals (set the timelimit parameter too small) and then corrected it. 
      * He has also investigated the difference between the console and html coverage report. It seems that the console one counts statements while the html one counts lines.
      * In the next week, he will add the experience of how to do mail and taskqueue related tests with gaetestbed to the testing wiki page.
      * He will also make a patch for removing the cron/job related modules and then send it to the list.
      * He will also continue to work on the testing project after GSoC, i.e. add more test cases for more modules, improve the testing design and code, integrate Felix' data seeder, and so on.  
  * *Action items:*
    * Students should write on their project wiki pages about what they have done, what they have not done and their plan to bridge the gap after GSoC compared with their original plans. 
  * *Important notes:*
    * Sverre won't be able to attend next week's meeting.
    * Daniel will host next week's meeting.
    * All students are welcome to attend it. 

== 09 Aug 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>

  # Update on GSoC Projects
  # Integration of GSoC projects
  # Round the table
  # Post-GSOC

=== Meeting notes 09 Aug 2010 ===
  * Attendance:
    * Felix could not attend.
  * Update on GSoC projects:
    * Data Seeder: 
    * Document Editor:
    * Social Features:
      * Savitha did the maps view for events and users. It works only for single-word terms at present but will be improved to have multi-word terms and search the data based on those keywords.
      * Next week, she will be working on writing tests and also testing the workflow of the Calendars feature to ensure that there are no bugs.
      * She will resolve the Application Read timeout error being caused by appengines short timeout.
      * She will clean up code and discuss with Madhu options to review code and merge.  
    * Testing:
      * Leo uncovered a couple of bugs of existing Melange modules with the help of related test cases and has sent pathes to the list.
      * He also resolved the error "raise self.__TranslateError(e.application_error, e.error_detail) UnknownQueueError" by adding the path of taskqueue yaml setting file to the instantiation arguments list (root_path) of taskqueue_stub.TaskQueueServiceStub.
      * He added gaetestbed modules to tests and then extended its MailTestCase and TaskQueueTestCase and further put them into tests.util module for testing the mailing and taskqueueing functions.
      * He has also done some new tests and managed to increase the testing coverage of Melange to 59%.
      * He found that the coverage report of the html version is different from the console one. He will investigate the difference with suggestion of Sverre.
      * Next week, he will clean up code and commit and push all uncommited testing code, increase the overall coverage printed in console to over 60%, and make the coverage of most modules over 50%. 
      * He will also move the the gaetestbed and pymox modules to buildout dependency and add the experience of how to do mail and taskqueue related tests with gaetestbed to the testing wiki page. 
  * *Action items:*
    * Students should talk with their mentors about merging their code to the trunk. 
 

== 02 Aug 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>

  # Update on GSoC Projects
  # Round the table
  # New co-lead
  # UI redesign help

=== Meeting notes 02 Aug 2010 ===
  * Attendance:
    * All present.
  * Update on GSoC projects:
    * Data Seeder: 
    * Document Editor:
      * Pavel reimplemented RevisionContent model to store arbitrary number of fields as JSON.
      * He refactored logic and views to support new revision control architecture.
      * He will finish revision control for StudentProposal in a couple of days.
      * He will start working on form auto-saving feature next week.
    * Social Features:
      * Savitha Integrated Cal Vis library and UI with the Calendars feature.
      * She redesigned the CSS of the Calendar to make it look more professional and Google-like.
      * She added Maps for users to specify location when creating Maps.
      * She is working on the Maps Feature for displaying all users and events, and filtering. She hopes to complete this by the end of the week.
      * She is still facing the two API time-out errors and needs to find a way around it. 
    * Testing:
      * Leo has managed to increase the testing coverage to 57% with the work on low coverage ghop modules.
      * He found that there is one taskqueue_stub in google.appengine.api.labs.taskqueue and he registered it to 'taskqueue' service. But another error is raised "raise self.__TranslateError(e.application_error, e.error_detail) UnknownQueueError". He is working on it.
      * Next week, he will try to solve the error first and then check in all code.
      * He will also add more tests and aim to increase the testing coverage of Melange to over 60%.
      * He will also try to find a good way to test the mailing and taskqueueing functions and make sure the correct mail has been sent out and the correct task has been scheduled. 
  * *Action items:*
    * Students should continue to add tests to their code. 
  * *Important announcement::*
    * Daniel will serve as co-lead of Melange.
    * echoditto will redesign UI for Melange with the request of Carol. Melange will soon have a new feel and look :-). 

== 26 Jul 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>

  # Update on GSoC Projects
  # Round the table

=== Meeting notes 26 Jul 2010 ===
  * Attendance:
    * Savitha couldn't participate.
  * Update on GSoC projects:
    * Data Seeder:
      * Seeding process is fully functional using a simple view.
      * Felix is currently attempting to integrate an AppEngine MapReduce framework.
      * He will mail the dev list and CC durin42@gmail.com about where to place thirdparty libraries (currently in app/). 
    * Document Editor:
      * Pavel Last week fixed issues in the logic code pointed out by Daniel
      * He reimplemented "show diff" button using Mario's patch to the lists framework.
      * He started working on revisions for StudentProposal, but came across the problem
        * StudentProposal has two fields: "content" and "abstract", which must be versioned.
        * Current implementation of RevisionContent model allows to store only one field.
        * Daniel proposed to store multiple fields as a JSON document. This approach is easy to use and scalable.
      * He will reimplement revisions using JSON and implement revisions for StudentProposals this week.
      * Sverre is worried about tests for his code. He will add tests this week.
    * Social Features:
      * Savitha wound up calendars features mostly. She used the javascript maps package to let users specify exact location of event so it can be used along with CalVis maps features.
      * She also worked on CSS designs for CalVis Calendars.
      * She will start to work on Maps feature/view for all users and events this week. 
    * Testing:
      * Leo mainly worked on low coverage modules, e.g. soc.tasks.surveys, soc.tasks.grading_survey_group and etc this week.
      * He has managed to increase the testing coverage of Melange to over 55%.
      * He will clean up the code and will commit and push them.
      * One problem he met is that there is no api proxy stub available for service "taskqueue" yet, so it raises an error "ERROR:root:No api proxy found for service "taskqueue". He is also working on it.
     * In the next two weeks, He aims to increase the testing coverage of Melange to over 60% and increase the testing coverage of those modules below 50% (40% at least) to over 50%. 
  * *Action items:*
    * Students should continue/start to add tests to their code. 
    * Mario will try JS-Test-Driver along with YUI Test 3 and see if it works :) 
    * Mario has done some inspecting about JSTestDriver and YUITest. YUITest seems still active (version 3 now), and he prefers this testing framework as it's the one that suits better our needs, especially about testing asynchronous code. He's not sure about the correct integration between JSTestDriver and YUITest, as one post on JTD mailing list says it's not working, but the wiki seems to say the opposite. So he needs to try it out and see if everything works.
== 19 Jul 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>

  # Update on GSoC Projects
  # Round the table

=== Meeting notes 19 Jul 2010 ===
  * Attendance:
    * Pavel couldn't participate due to unknown reason.
  * Update on GSoC projects:
    * Data Seeder:
      * Felix had some problems with client-side JavaScript templating engines, switched a few, found some bugs and finally went with [http://beebole.com/pure/ pure].
      * He is now working on enhancing the web interface to support references.
    * Document Editor:
    * Social Features:
      * Savitha worked on user authorization for data apis for org_admin and prog_admin roles.
      * She had to make changes to the event logic file to handle different authorizations and storing the token etc.
      * She has encountered two weird errors from appengine, which is caused by a timeout, will mail dev list detailed traceback.
      * Calendars UI has been tentatively fixed on CalVis, and she needs to change the design so it looks more slanted towards google's design.
      * She was supposed to have started on Maps feature this week, but still winding up the Calendars.
    * Testing:
      * Leo met one problem that nose tests could not run the GSoC View tests he added. He then solved the problem by adding __init__.py to the GSoC test packages.
      * Leo has only managed to add 1% more coverage last week which is far less than the original target 10%.
      * Sverre thought the original plan was not realistic. Leo agreed and adjusted this week's target to 5% more including last week's 1% more. 
  * *Action items:*
    * All students should focus on tests this week.
    * Sverre will merge Leo's test infrastructure code.
    * Mario will discuss which Javascript testing framework to use (update next week).
    * All students will update the notes wave with their progress so far.
    * Daniel will contact Pavel to figure out what's going on, with update next week (at the latest).


== 12 Jul 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>

  # Update on GSoC Projects
  # Round the table


=== Meeting notes 12 Jul 2010 ===
  * Felix couldn't participate due to issues with his internet connection.
  * Update on testing project:
    * Leo solved the problem that coverage does not track the properties definition of Melange models by  using pymox stubout to stub out nose.plugins.cover.Coverage.begin so that it loads Melange before the testing coverage starts.
    * The test coverage of Melange is now over 50%.
    * He further worked on various views, e.g. sponsor, program, student, organization, etc.
    * He will do more view and logic tests and aim to increase the overall code coverage to over 60%.
  * Update on document editor project:
    *  Pavel has implemented all functions of revisions, e.g.  "Revert to revision", and uploaded them to his appspot instance.
    * He managed to make button work with the help of Mario.
    * He plans to deploy python html diff engine, create view that show diffs for revisions and make code clean-up this week.
    *  Daniel will send Pavel some feedback later.
  * Update on social features:
    * Savitha worked on getting the workflow for the Calendars features and uploaded the latest to my appspot, e.g. Progadmin activates Calendars, Orgadmins get notifications, Orgadmins accept, all users can now view all calendars and events, users can add events by selecting which Calendar they want add to (non-owners such as students and mentors will have to wait for approval).
    * She will work on user authentication (plain text password and user name are currently used) and the synchronizing of calendar events between Melange and Google Calendar.
    * She considers GData APIs but needs to figure out a way to get Auth token from the user API with Madhu.
    * She and Madhu are going to go through the workflow, code and integration.
  * *Important notes:*
    * Daniel suggested to take meeting notes on Google Wave and Sverre suggested to still put one copy on the wiki. Leo will have a try.
    * Felix needs to complete a blog post.

== 5 Jul 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>

  # Update on GSoC Projects
  # Round the table

=== Meeting notes 5 Jul 2010 ===
  * Blog posts: All students have posted their blogs in this week.
  * Update on data seeder:
    * The seeder is able to seed models without any references and the data providers work correctly.
    * Error/progress reporting has been implemented on the backend but not on the web interface frontend.
    * Mario and Felix think about integrating a client-side HTML templating engine in JavaScript to Melange in order to build HTML on the fly on the client side.
    * Three options are being considered, i.e. pure, jQuery tempest plugin and DOJO DTL. Mario feels that the third option may be too much messing on the current architecture.
    * Mario and Felix will further talk about the three options after the meeting, possibly on the list.
  * Update on testing project:
    * Leo found that Python coverage does not track the properties definition of models. So, doing model tests adds little testing coverage.
    * He also found there are not a lot to do logic tests because most methods of other logical are inherited from base logic.
    * He will focus on doing view tests now, especially on those with low coverage.
    * He has not done a lot last week due to breakdown of his hard drive and he'll try to do more this week.
  * Update on document editor project:
    *  Pavel implemented views that show revision with given revision number and lists all the revisions for the given entity and uploaded them to his GAE instance, which looks good.
    * He met two problems. The first one is to track different key/value pairs for the params dict. He solved it by using a debugger. The second one is to create configuration JSON for buttons and actions with  list framework. With the help of Daniel, Sverre and Mario and reading the JQGrid documentation, he has started to understand the lists and could even create some buttons and associate behaviour.
    *  He will do his best to finish views in a couple of days to start implementing diffs before the midterm evaluation.
  * Update on social features:
    * Savitha started working on the Calendars/Events feature: she has created the event data model/logic/views (e.g. list events), and uploaded to her GAE instance http://melange-social.appspot.com/site/show/site.
    * Two types of events are created, one is the local event_entity stored in Melange and the other is the one sent to Google Calendar. They are not synchronized until now and Savitha is working on it.
    * The UI of the calendars is being discussed on the mailing list and not decided yet. Google Calendar UI is currently used.
    * User Page has been mostly done. The new CSS designs will be uploaded by this wednesday.
    * There are no restrictions for different user roles at present, e.g. everyone could create their User Pages and the go on to add events to the Calendar. Savitha is working on it and will get it done hopefully by this weekend.
    * Savitha decided to get the Key for the JS API maps following Mario's advice.
  * *Important notes:*
    * Pavel and Felix found the params mechanism a bit hard to understand, especially combined with other things such as patterns and checking access etc. Felix thinks more documentation is needed. Sverre encourages students to add their findings to the params wiki page http://code.google.com/p/soc/wiki/SocParams .
    * Sverre suggests Pavel and Mario together with him to create a wiki page for the list framework.
    * Mario suggests Pavel to add link of JQGrid documentation that it's not yet linked, if any, inside the text of the ListsProtocol wiki page.

== 28 Jun 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Leo (Chong Liu)<br/>

  # Blog posts (where are they?)
  # Update on GSoC Projects
  # Round the table

=== Meeting notes 28 Jun 2010 ===
  * Felix couldn't participate because he was taking an interview.
  * Blog posts: Savitha and Leo will make a post later today.
  * Update on testing project:
    * Leo has added content to the wiki page GettingStartedOnTesting and asked for feedbacks. Sverre has had a look at it and thinks that it should be extended, though it looks good. Sverre will help Leo extend it if time allows.
    * The coverage of the test is still low. Sverre suggests Leo to focus the modules with low coverage next week, e.g. do some tests on the models.
  * Update on document editor project:
    *  Pavel made some changes on the revision models, implemented a few revisions for documents and will push his code later.
    *  The revision control currently only works on backend not on front side.
    *  Pavel will add others as a developer on his Appspot instance
    *  He is implementing the view which helps to work with revisions. He find some cool features of Melange, e.g. Button, checkbox etc. which can be used in his work.
    *  Pavel and Danial will interact and discuss more about the project.
  * Update on social features:
    * Savitha made changes to user pages, e.g. add new jobs and educations but could not deploy it to her Appspot instance because she could not access app engine on weekend, which is quite normal in India according to Madhusudan.
    * She is able to have access to it today and will deploy later.
    * She will work on Calenda later.
    * She is behind the schedule but believes she can catch it up because she has become familiar with the codebase.
    * She met problems when using blob properties for images and will email the detail of the problem to the Melange list later.
  * *Important notes:*
    * Sverre will go to America the day after tomorrow and will spend some quality time with his girlfriend.
    * Lennard will start his internship in Australia next week.
    * Students should make their blog posts before the weekly meeting.
    * All students should add everybody as a developer on their Appspot instance
    * Students should ask on Melange list as well as their mentors when they meet problems

== 21 Jun 2010 Team Conference Call == 

* Chaired by:* Lennard de Rijk <br/>
* Notes taken by:* Pavel Klemenkov<br/>

  # Update on GSoC Projects
  # Round the table

=== Meeting notes 21 Jun 2010 ===
 * Daniel couldn't participate, cause he is in the US now.
 * Update on document editor project:
  * Back-end for revisions is working now. It is deployed at http://melange-editor.appspot.com
  * View that helps to work with the revisions (show revision, show diff and revert) is going to be implemented on Wednesday.
  * Need to write script that converts existing entities into the new ones.
  * It is a good decision to implement property methods in the models, cause it makes rendering templates easier.
 * Update on testing project:
  * Last week Leo made Django test client to work with Melange.
  * This week he plans to write more tests on logic.
  * Leo also wants to create Wiki page that describes current testing environment.
  * Lennard wants more tests :)
 * Update on social features:
  * Savitha has almost finished user pages. Updated instance is deployed at http://melange-social.appspot.com
  * Searching users based on tags is to be done.
  * Savitha starts working on calendars this week.
  * Savitha needs to add tooltips for new fields.
  * Lennard notices that "Preferred name" is the same as "Public name" from User model.
  * Visibility is for entire page now, but it should me made more granular.
 * Update on data seeder:
  * Felix is setting views for his module. Melange lacks support for views that are not connected to some model or logic.
  * Felix thinks that his current solution looks like a hack, but plans to refactor it in the future.
  * Every model includes all the fields from base models. That's why it is so much JSON right now. Felix needs to take care of it.
 * *Important notes:*
  * Lennard leaves and can't be project leader for a while. He will not be able to participate in conference calls. Sverre is our new leader. He is responsible for everything! :)
  * All students should continue sending updates on mailing list, posting blog updates, contributing code, writing tests and working hard!

== 7 Jun 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Savitha<br/>

  # TODO's from last week
  # Update on GSoC Projects
  # Round the table

=== Meeting notes 7 Jun 2010 ===

	* Lennard is at a friends place and will not be attending today's call.
	* Pavel is in Syberia regarding his PhD and will be unable to attend.
        
 
        * Data Seeder Project Update
               * After IRC discussion with Mario, rewrote/merged AJAX APIs and is okay for now, will discuss further if any problems arise.
               * Implemented most Data Providers
               * More or less on schedule, but will put in more hours this week.

        * Testing Project
               * Leo is on schedule.
               * Had some problems getting Django's testing client to work with Melange, it is now resolved.
               * Will be spending more time on the project over the week and weekend.
 
        * Social Project
               * Slighly behind schedule, planning to catch up by putting in more work hours this week.
               * Had some problems with the OS etc. in setting up working environment. Now all set up work is done and ready to do more coding.
               * Clarified doubts about framework and code as and when with Madhu.

        * Document Editor Project
               * Pavel is not in town and will update Daniel on his project once he is back

        * TODOs for Students this week
               * Hang out more on IRC and don't hesitate to ask questions to the rest of the team if your mentor is not around/offline. You can mail the developers-list your questions too.
               * Keep team updated on project, travel schedules etc.

== 31 May 2010 Team Conference Call == 

* Chaired by:* Lennard de Rijk <br/>
* Notes taken by:* Felix Kerekes<br/>

  # Planning Q3-Q4, what do you want to do?
  # Update all other GSoC Projects
  # Round the table

=== Meeting notes 31 May 2010 ===

	* New document editor
		* Pavel's wiki missing timeline for second half
			* Pavel is not sure about the timeline
			* Goal for the midterm: finishing revision control
			* Second part should involve deploying and integrating MarkItUp and Markdown
		* Pavel would like to discuss possible options (which are posted on the wiki)
		* Conclusions:
			* Document model should be refactored: add revisions as a ListProperty
			* There is no point to create separate model for revision, Work can be refactored
			* Revision descriptions will be included as StringListProperty in Document model for easy access

	* Social features
		* Missing second part for timeline
			* Maps left for second part of the project
		* Savitha pushed some changes to http://melange-social-features.appspot.com
			* Would be nice to embed Google Calendar
			* Tabs will be populated in the next days

	* Data seeder
		* Felix needs to have a meeting with Mario to discuss the AJAX API

	* Testing
		* Leo has committed some test which are looking good
		* Tests should be reviewed and pushed to Melange if everything's fine
		* Sverre will check coverage and see if important functionality is covered

	* TODO for students
		* All developers should be added as project members on everyone's clone
			* "Allow non-members to review code" should be checked
		* Add "melange-soc-commits@googlegroups.com" to activity notifications

	* Q3-Q4 planning
		* Mario has enough work to do on the user interface and refactoring JavaScript
		* Mario would like to postpone designing prototype UI to 31st of August (and edit the wiki page)
		* Daniel is missing, needs to take a look at this and decides wether he has time for something.

== 24 May 2010 Team Conference Call == 

* Chaired by:* Lennard de Rijk <br/>
* Notes taken by:* Sverre Rabbelier<br/>

  # Data Seeding Project, ?Script for Fixtures?
  # Update on all other GSoC Projects
  # Round the table

=== Meeting notes 24 May 2010 ===

  * Felix asks how to convert seeding to fixtures
  * Decision is to convert data to fixtures
  * First seed data into datastore, optionally mess around with it, then convert to fixture
  * Tentative timeline posted to wiki
  * Lennard and Sverre will look at DataProviders

  * Leo worked on adding more testcases, had some trouble, but now has everything set up
  * Going to work on coding more this week
  * Noticed the current fixtures don't delete data on tearDown
  * Sverre remembered (after the talk) that this is not a problem since the datastore is emptied after every task

  * Discussed how to handle Calendars (public/private, one account)
  * Savitha is planning on finishing early stages of user profile this week, Lennard has asked for a demo on appspot.com for early feedback

  * Going to focus on revision control for now (diffing will be done later)
  * Trying to figure out how to store documents in the new document model
  * All current entities will have to be converted
  * Pavel needs to create his Wiki (and add a timeline)
  * All students should put a full timeline on their wiki

== 17 May 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier<br/>
* Notes taken by:* Lennard de Rijk<br/>

  # TODO's from last meeting
  # Social Features Project update/discussion
  # Update on all other GSoC Projects
  # Planning Q3-Q4 update
  # Round the table

=== Meeting notes 17 May 2010 ===

  * Pavel is not here
  * Felix had a cancelled train :(
  * Mario and Madhu have no need for access to socghop
  * Carol will check up on the 4 signees for the Melange CLA

*Social Project*
  * Profile page
    * Biography field, no separate education
    * We want the ability to annotate projects, to make the page look more alive
    * Blog feed
    * We would like to give additional projects a try, 
    * Isn't visible by default and contains only public name/link id on default
    * If all turns out well we need a feature to notify users that they have to fill in their profile
  * Calendar page
    * How does the Calendar interact within the users space? Do we/can we force to create calendars on their account? Do we want them to give links to calendar.
  * Map API use
    * RSS feeds for events per subject, might leverage NewsFeedFramework from James (talk on list)
    * Tags on events and users
    * Users are not forced to publish their location
    * 3 components of social projects
      # User pages, current and past projects (and blog feed if possible)
      # Calendar API use, events going on in program as well as organization calenders. Can suggest new events 
      # Map API use, show users and events.

*Testing Project*
    * Had meeting with Sverre about project last Friday
    * This week add more testcases to important module, base Logic and View
*Document editor*
    * Emailed Pavel last Friday/Saturday about project, Pavel working on PHD exams over tomorrow.
    * This week research HTML diff

*Data seeder*
    * Meeting on Tuesday, notes posted
    * Blogpost with fancy graphics made
    * Results of research into YAML, XML, Fixtures for making data models

* What else *
  * *IMPORTANT* Mails to mentors should be sent ot melange-dev as well, transparency 
  * TODO: Sverre should flesh out the testing part and figure out a date for when tests should be made with each commit
  * We have no projects from Antartica :(
  * Meeting about releases with Daniel after this call

== 10 May 2010 Team Conference Call == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* carols<br/>

  # TODO's from last meeting
  # Statistics module, deployment on socghop
  # Testing project by Chong Liu (what/how/focus on/todo?)
  # Document editing by Pavel Klemenkov
  # Updates on other GSoC projects
  # Planning Q3-Q4
  # Round the table

=== Meeting notes 10 May 2010 ===
We need to run a script to get the statistics module started<br>
 Carol needs to get Mario, Madhu and Daniel access to the student data [TODO]<br>
 Leo is here this week - new student!<br>
 Leo will be working on a test tool; figure out what's important, what we want to test<br>
 Sverre will talk to Leo more this week about getting started and finding things to do<br>
 Document editor is now more stable<br>
 HTML diffs will need to be included in the document editor - Pavel can research this, but doesn't want to do it himself<br>
 Sverre will search for HTML diffs [TODO]<br>
 Revision control and autosaving are important<br>
 Felix has been looking at the entities module and created a small tool that extracts the diagrams from the code - Sverre thinks there might already be one of these in the scripts directory<br>
 Felix made some cool .pngs of the relationships and will post on the blog<br>
 Everyone should make a post every week before the end of their Friday so Lennie and      Sverre can review over the weekend<br>
 Mario should update with more concrete UI ideas so Lennie can put it in the grid
 Mario and Lennie will have to have a chat this week [TODO]<br>
 Everyone needs to sign the CLA and let us know that they did so [TODO]<br>

== 3 May 2010 Team Conference Call == 

* Chaired by:* Sverre Rabbelier <br/>
* Notes taken by:* Lennard de Rijk<br/>

  # Introduction, who are you?
  # Statistics module update
  # Things students need to do, or we need to do for them (ie. blogging rights)
  # Testing project by Chong Liu (what/how/focus on/todo?)
  # Data seeding project by Felix Kerekes
  # Social Features project by Savitha Raghavendran
  # Document editing by Pavel Klemenkov
  # Q3-Q4 planing (and perhaps a bit of Q2)
  # Round the table

=== Meeting notes 3 May 2010 ===

 Not Attended: Daniel Hans, Chong Liu

 * Carol is out of stroopwafels
 * Mario is our resident JS expert
 * Sverre, forgot to tell us about himself
 * Lennard will head to Sydney in July ^_^
 * Pavel is our PHD from Moscow, his Vodka > Polish Vodka
 * Savitha will work on social features, a Bachelor student
 * Felix, worked on Pidgin last year and has troubles with Skype :)
 
On to the real stuff

 * Todo for our students this week, make a clone on Google code and test/deploy Melange to your own GAE instance.
 * As well as mailing us the account you would like to use for melange-dev.blogspot.com
 * Integrate early and often, with tests only :)

Data seeding project:
 * IRC meeting after the call to further discuss this project *Edit Tomorrow 17.00 CET*
 * Will look at the data seeder code from Daniel this week, try to salvage useful parts
 * Start on design documents, first up web interface workflow (*Lennie suggests using wiki :)*)

Social features project:
 * Most import features to Savitha are, Map + Event calendar. Secondly the personalized profile page.
 * Sverre notes that a automated TODO list might be nice, for instance reminding our org admins to update their home page.
 * Will have meeting on 5th of May at 13:30 (UTC) with Madhu about further details on #melange IRC channel.

Document Editor project:
 * Worries about the revision control, makes valid point that storing everything is not nice. However Sverre points out that data is cheap and CPU is expensive on AppEngine.
 * MarkItUp seems to work

Q3-Q4:
 * GHOP, Madhu + Lennie should work on making that more tangible
 * Usability, Mario needs to work something out for that
 * Testing, Sverre suggesting getting more time for it. Chong Liu's work should help.
 * Javascript refactoring, most likely be assigned to Mario

And as last
 * Next All-Hands most likely before/after Mentor Summit


== 26 Apr 2010 Team Conference Call == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Lennard de Rijk<br/>

  # Volcano Fall-Out
  # Statistics Module
  # Our GSoC Projects
  # Round the table

=== Meeting notes 26 Apr 2010 ===
  * Everybody is now home safely!
  * Carol is in need of pictures for the Ashpocalypse blog
  * Daniel is not here right now, so skipping statistics
  * GSoC Students will be contacted by their mentors asap
  * They will be posting their weekly updates on the Melange blogspot page


== 15 Mar 2010 Team Conference Call == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Sverre Rabbelier <br/>

  # Duplicates handling (Madhu)
  # StudentProposal Review fixes (Daniel)
  # Work on the Lists (Mario & Sverre)
  # Round the table

=== Meeting notes 15 Mar 2010 ===

 * Duplicate handling: Lennard has taken a look at it, looks pretty good, but we currently show the project is a duplicate as soon as the slot assignment is made public
 * Duplicates will also be listed on the overview page 
 * Duplicates will include email address of organziation admin
 * Send new patch where the duplicate status is not shown yet, for now
 * Will be discussed further on GTalk
 * Daniel did not have as much time as expected, but hopes to be done tomorrow
 * Lennard will fix help text
 * There are some outstanding list issues that Mario and Sverre plan to fix when possible
 * Leslie will send Lennard edits to organization acceptance email

== 15 Feb 2010 Team Conference Call == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Lennard de Rijk<br/>

  # Updates on roadmap assignments (201, Taggable Orgs, Org Applications, Duplicate Proposal Task)
  # GSoC Testing Week update


=== Meeting notes 15 Feb 2010 ===
  * Lennard will redo the Notifications page so that the buttons work
  * Lennard will prepare melange-dev on Saturday
  * Sverre will be responsible for pushing the tip to melange-dev. Special version numbers for the testing week are r....-gsoc where .... is part of the rev number.
  * Sverre will continue his work on the lists, a few more to go. Will send overview of which lists need to be done to melange-dev.
  * Lennard will use his spare account during the test period to play the role of Organizaiton, Sverre will use his to be a Student.

== 8 Feb 2010 Team Conference Call == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Leslie Hawthorn <br/>

  # Recollection of last week's work
  # Issue 201, update
  # Organization Applications update
  # Taggable Organizations update
  # GSoC Testing Week update
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 8 Feb 2010 ===

Present: Sverre Rabbelier, Daniel Hans, Mario Ferraro, Lennard de Rijk, Leslie Hawthorn, Carol Smith 
Absent: Pawel Solyga, Madhu CS, 

==== Around the "Room": Lennard ====
* Lennard has assigned Madhu to work on duplicate detection of proposals, should be finished next week
* Removed the group application system since new org application system is in place
* Removed ranker system for GHOP organizations

==== Around the "Room": Sverre ====
* Been working on last five out of 30 lists for Summer of Code, progress has been slow because code base is tortuous; some other lists outstanding for GHOP
* LH to follow up with Sverre on API stuff for automatic acceptance of student projects to get resources from Google to help with this task since lists are taking so long

==== Around the "Room": Mario ====
* Working on list bugs and ehnancements, externalizing of tooltips and autocomplete JS code from templates, see message to Dev list (Django trouble)
* Writing wiki page on list protocol

==== Around the "Room": Daniel ====
* Finishing autocomplete list and taggable organizations, working on bug discovered when creating GSOC 2010, scheduled to be done next week

==== Around the "Room": Leslie ====
* Testing phase starts 22 February, Lennard will write note to dev list to kick off

==== Organization Applications Update ====
* Lennard has finished basic views, hooking up button to process org apps, e.g. pre-accepted or pre-rejected then gets processed to send emails to org admins who submitted apps; testing system this week

==== Testing Week ====
* Two week period starts 22 February
* Lennard will work on org views and send mail to the dev list to call for testers
* Sverre will email LH details on API work needed and LH will reprioritize top 10 list


== 1 Feb 2010 Team Conference Call == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Leslie Hawthorn <br/>

  # Recollection of last week's work
  # Issue 201, testing update
  # GSoCX Ideas wiki page feedback
  # GSoC Testing Week
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 1 Feb 2010 ===
Present: Sverre Rabbelier, Mario Ferraro Lennard de Rijk,Madhusudan C.S., Leslie, Pawel Solyga 
Absent: Daniel Hans 

* Starting today, you can start working off of soc current
* Plan made for week of testing, Lennard has made a schedule; will send it to Leslie for review then publish to Melange Dev list
* Lennard has already made the needed change for participant agreements (labeling the link Full Text (Printable Page) as requested by Google legal

* Next Week: 
  * Sverre will commit new list code today and work on fixing remaining list issues (see "Around the Room")
  * Lennard is working on org application reviewing process, which will need new list code that Sverre is finishing up;[http://socghop.appspot.com/gsoc/program/accepted_orgs/google/gsoc2009 Accepted org list] on socghop.appspot.com is currently broken; Lennard will cut a new release
  * Mario will be working from feedback received on his work on Issue 201, needs to do some refactoring 
  * Madhu will be updating the wiki and will be in touch with Lennard

==== Around the "Room": Sverre ====

* Sverre is working on changes to Ajaxy list system as demoed at January All Hands, changes will be committed today; hopes to finish all work on lists this week
* Some lists are more difficult to fix than others since they are embedded, e.g. the "get evaluations list" and "manage student projects" page for org admins; Sverre is figuring out how to fix this

==== Around the "Room": Mario ====
* Also working on lists with Sverre; Sverre will be making changes based on Mario's current work, cleaning up comment history, etc.

==== Around the "Room": Lennard ====
* Reviewed Ideas for GSoC 2010 and really likes Mario's ideas.

==== Around the "Room": Madhu ====
* Not much time this week, will be picking up on testing; working on updates for 2010 program and GHOP to-do's; will ping Lennard offline for more details

== 25 Jan 2010 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Google Wave <br/>

  # Recollection of last week's work
  # Issue 201, testing update
  # GSoCX Ideas wiki page, bring your ideas to life!
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 25 Jan 2010 ===

Present: Sverre Rabbelier, Mario Ferraro and Lennard de Rijk
Absent: Leslie Hawthorn, Daniel Hans and Madhusudan C.S.

  * Testing and committing of Issue 201 will be done on/before next Monday. All lists except the two which needs input functionality will have been changed. This change will not be pushed live yet.
  * Lennard will move the Wiki entry on the GSoCX ideas page. Document editing looks good so does testing. Usability not reviewed yet.
  * New release by Lennard before next call, will not include Issue 201.
  * Mail has been sent to Leslie about when to flip the switch on freezing 2009 data (Lennard stupidly forgot to CC Sverre :P)
  * For next week, Lennard will fix issues arising with GHOP due to Marcelo and continue work on Org App reviewing. Sverre will work on Issue 201 and Mario will have to take it easy due to work :).


== 21 Dec 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Google Wave!<br/>

  # Recollection of last week's work
  # Issue 201, status?
  # Freezing a GSoCProgram update
  # Update on the agenda for the Melange Meeting in January  
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 21 Dec 2009 ===

    * Paweł fixed an issue with showDuplicates method and is going to fix seed_db, because it is broken as a result of module conversion
    * A number of import errors were fixed the last week. Also, a new release
    * Sverre is working on the python side for the Issue 201
    * Mario looked into all issues connected to Issue 201, and is fixing what is missing as far as possible. Some issues will remain open to be solved after integration.
    * Lennie and Daniel continued working on freezing a GSoCProgram. There are still some changes that need to be done to the sidebar menu, but they are going to commit it soon.
    * Melange Meeting in January is going to be split into per-topic sessions
    * New release is not scheduled for the upcoming week
    * The new BLOP API (introduced recently to GAE) is going to be discussed in New York (probably during lunch time :-)) 

== 14 Dec 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Google Wave!<br/>

  # Recollection of last week's work
  # Missing Tests from Madhu
  # Issue 201, status?
  # StudentProposal Task API update
  # Freezing a GSoCProgram update
  # Topics for the Melange Meeting in January  
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 14 Dec 2009 ===

    * Madhusudan is absent, so not able to give us the update about the tests
    * Mario continued his work on Issue 201 and resolved some technical problems which he had encountered with the JS side.
    * Sverre mostly worked on module conversion last week and reinstalled his laptop during the weekend.
    * Sverre expects a lot of backend side work for fixing Issue 201, deadline still looks good
    * Paweł was traveling a lot, so his work focused on reviewing the revisions and patches
    * Paweł is going to work on intoducing Task API to StudentProposal, Lennie suggests he really focusses on it because of the complexity.
    * All participants of the Melange January meeting have already booked their tickets
    * Lennie and Daniel worked on entities freezing and are going to actually freeze the GSoC 2009 soon
    * Leslie wants a walkthrough of Melange on Monday
    * Dan Bentley is going to join the January meeting too (and will host on Friday) :-)
    * Lennie will work on the Agenda for the January meeting, will try to have the outline finished on Sunday 

== 7 Dec 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Google Wave!<br/>

  # Recollection of last week's work (Tests?)
  # Datastore conversion succeeded, what's next?
  # Issue 201 status update
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 7 Dec 2009 ===

    * Module conversion done
    * Mario working on Issue 201
    * We need to move models, logics, and templates to the gsoc folders
    * Lennard has spoken with Leslie, she's back
    * Hopefully news on whether Mario and Daniel are attending the NYC meeting
    * Almost everything functional with mock JSON objects
    * Multiple tables in one page (loading done asynchronously)
    * Querying done on keys, we'll need to add indexes as requires
    * Lennard will be working on module conversion issues that pop up
    * He'll also work on the entity freezing patch (reviewing the patch he received from Daniel)
    * Mario will continue to work on 201, and 702 if he has time
    * Sverre will work on moving the logic and on issue 201
    * Sverre will cut & deploy a new release
    * Daniel will continue working on whatever comes up and help in the module conversion 

== 30 Nov 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Google Wave!<br/>

  # Recollection of last week's work
  # Update on planning Q1-Q2 '10
  # Module Conversion update
  # Issue 201 status update
  # Testing, use of Fixtures?
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 30 Nov 2009 ===
    * Flipping the coin works for choosing notes taker :-)
    * Madhusudan worked on new fixture module for GHOP which was reviewed by Sverre.
    * Daniel sent a patch for entity freezing and did a code clean-up based on pylint suggestions.
    * Module conversion is probably going to happen next weekend. Backup has been completed by Dan Bentley.
    * Nothing new for issue 201 was committed last week. Sverre is going to start working on the backend side tomorrow.
    * We will go ahead with the Fixture framework.
    * Daniel is going to double check the code changes which concern the module conversion.
    * Pawel is going to start working on finding duplicates issue soon.
    * Madhusudan will continue his work on tests and update the wiki with the fixture usage.
    * Lennard will release the roadmap by the end of Tuesday and will try to push the module conversions onto socghop together with Sverre by this weekend (if it all works).
    * Issue 225 marked as fixed by Daniel 

== 19 Oct 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Sverre Rabbelier <br/>

  # Recollection of last week's work
  # Mario's preview of Issue 201
  # Update on XSS Tokens
  # Update on GHOP progress
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 19 Oct 2009 ===
    * Lennard tested all module conversions and made fixes where needed
    * Issue 201 demo is up, Mario tested with a lot of items in a list which seemed to work
    * We now have to make sure we can do the incremental fetches (mostly python side work)
    * Put issue 201 on hold until after GHOP is working
    * Mario thinks we have pretty much everything we need on the JS side
    * Madhusudan fixed issue 694 and attached the patch to the tracker, Lennard will review.
    * He had some problems with appspot yesterday so is working mostly locally
    * During weekdays he will have little time for Melange
    * Next weekend Madhusudan is totally free to work on Melange
    * Priority right now is that tasks can be succesfully added, and edited, and that they can be claimed
    * Madhusudan approves of the new Ajaxy list
    * No news from Dan on the security issue, will request an update.

Action items:

    * Sverre will send Dan/Google an email to ask what's going on, would be nice to get an indication
    * Sverre will make the new views available in the GSoC module tomorrow and fix the url patterns
    * We will try to redirect old urls to the new urls (if possible) or to a notification page
    * Lennard will also work on the request system this week so that it will work with the module system
    * Update from Madhusudan on what is not working in the GHOP workflow by next Sunday
    * Lennard will have a look at the patch for issue 694
    * Mario's general JS patches will be pushed this week after review
    * Mario will also write down a protocol for communication between client and server
    * Pawel will review Mario's JavaScript patches (due in 3 more days) 

== 5 Oct 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Google Wave :)? <br/>

  # Meeting notes in Wave
  # Recollection of last week's work
  # Mario's preview of Issue 201
  # Update on model conversion (1 week left)
  # Update on XSS Tokens
  # Update on GHOP progress
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 5 Oct 2009 ===

 * Mario needs a wave account invite
 * Lennard and Sverre have succesfully implemented the 12 steps of awesome
 * Pawel added the csv export script (and made it generic for all programs) for Organizations and Roles (required to create Google Code GSoC projects)
 * He is still working on Timeline, Hard deadline tomorrow (6th Oct)
 * Madhusudan has fixed Issue 693 and committed
 * Sent bulk approval patch for review
 * Mario is working on Issue 201, no preview this way sadly
 * We need to have sorting and searching client side; sorting works client side, but we lose paging
 * It looks like JQGrid is based on a client-server grid more so than doing things server side
 * Note: main concern is to be able to search, not edit
 * As such this week it is now time to test the steps
 * Demo will be ready by next week
 * If tests are successfull we can start moving the entities
 * After this is done we'll be a lot closer to running GSoC and GHOP on the same instance
 * Model conversion is mostly done due to hard work by Lennard
 * We will add new Middleware to ensure that all POST requests have
 * Sverre will take a look at adding Token to DynaForm (this week, will report findings to Dan)
 * We will be able to run GHOP/GSoC simultaneously in 3 weeks, and we will keep the demo site up to date
 * Sverre will do next week's release
 * Lennard and Sverre will work on testing the data conversion
 * Dan will be working on the XSS token system
 * Madhusudan will be workin on Issue 692 and will keep testing GHOP functionality
 * Mario will be preparing his demo on Issue 201 for next week

== 28 Sept 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Sverre Rabbelier<br/>

  # Recollection of last week's work
  # Mario's update on Issue 201
  # Update on model conversion (2 weeks left)
  # Update on security issues
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 28 Sept 2009 ===

 * Pawel reviewed code all week
 * His csv script will also be commited
 * Sverre fixed an important security issue, only one more left! (XSS exploits)
 * Lennard has been working on GHOP fixes and data migration
 * Madhusudan was out-of-internet for 5 days and 2 days of PyCon.
 * PyCon was so-so due to unprepared speakers, awr :(.
 * Merio is better audible when he isn't there but writes an email instead :P.
 * Main reason of Ajaxy list is ordering and search, which might not be possible in JQGrid
 * Model conversion: Sverre committed the decorator
 * Lennard and Sverre are going to implement the 12 steps of awesome
 * Testing will happen next week
 * No reply on mail to Google WRT security issues, but Dan Benltey did contact Pawel two days ago
 * Guido van Rossum recently commited a XSS fixing decorator
 * SVerre will mail Dan Bentley again to ask about getting help with using that code
 * Sverre will do the release
 * Madhusudan will take a look at the recent GHOP breakages (Issue 693)
 * He will also be working on Public Task 
 * Lennard will be working on Model conversion
 * Pawel will work on Timeline this week

== 21 Sept 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Sverre Rabbelier<br/>

  # Recollection of last week's work
  # Mario's update on Issue 201
  # Views without specific model/logic (JQGrid examples, seed_db), how to?
  # Update on model conversion (3 weeks left)
  # Further actions for Issue 690
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 21 Sept 2009 ===

 * Mario was busy with his examns and got ill during the weekend (and couldn't attend his examn today)
 * He did put forth some effort towards issue 201
 * Tried to make a page because there's no way to create a page without a logic or model connected to it
 * The JQGrid example needs to talk to multiple models
 * The reason our views are tied to the models are because we never needed a soc.views.base untill now
 * For now put the demo in the user view, and then we will figure out where to put it
 * Skype is a pain as usual
 * Leslie joins the call
 * Converting the Demo to a final implemetnation will take a lot of time, but that's expected
 * KML patch looks good, will wait till next week's call to discuss what to do with the file due to Performance Reviews at Google
 * Sverre will look into key field changing in skip_fields
 * Sverre will report to Google on oustanding security issues



== 14 Sept 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Sverre Rabbelier<br/>

  # Recollection of last week's work
  # GHOP IRC meeting, goals and required data.
  # Mario's update on Issue 201
  # Update on model conversion (4 weeks left)
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 14 Sept 2009 ===

 * Daniel is not there
 * schmrz is listening in
 * Extra bonus agenda item: issues 690 that Erant brought up 
 * Lennard just committed a new access check that makes it impossible to read someone else's information
 * Want to make a new release since socghop is in maintenance mode now
 * LH asks to let her know ASAP if there's a (security related) emergency
 * Sverre will do a new release
 * Sverre worked on converting decorators.view to Middleware
 * Sverre also fixed the test suite except  the functional tests, Matthew Willekes pinged
 * Lennard worked on GHOP, almost everything committed now
 * Lennard also worked on the task conversion
 * Madhusudan has been busy with examns
 * IRC meeting this friday:
 * implement any needed features to run GHOP
 * pretty clear idea what we need to do
 * Madhusudan will clean up his TODO list
 * we really need to fix the conference-call problem
 * make sure everything functions as we think it should
 * we know what work needs to be done, guide and help people to help us by telling them what they can do to help
 * cleaning out melange-demo datastore
 * clear message to the community: "GHOP doesn't get run without you"
 * If the system doesn't meet your needs: you need to write the code to make it meet your needs
 * We need a clear todo list, and to have clear 'mentors' of each item
 * Up and running demo
 * Merio has been busy with examns too, and might be able to do some work, but will have more time after 21st
 * We can get ready for Model conversion (now we'll have to put the 11 scripts in place)
 * Would be a good thing for someone from outside to help out with
 * No commitment on conversion this week (from core devs) due to other activities
 * Pawel will do a release this week
 * Lennard will apply Madhu's Student patch
 * Sverre is working on the export_kml patch

== 7 Sept 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Paweł Sołyga<br/>

  # Recollection of last week's work
  # Discussion regarding models conversion
  # Discussion regarding code samples URLs in StudentProject model and generating links to code samples on Orgs home pages
  # Open table discussion about GHOP
  # Mario's update on Issue 201
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 7 Sept 2009 ===

 * Leslie talked a little bit about GHOP
 * Leslie received some emails from people interested to help with GHOP
 * Madhusudan didn't have time to update his tasks
 * Lennie thinks that there might be some problems with access controls in GHOP code
 * GHOP demo release hopefully for 18th of September
 * Melange Team will be working on GHOP during Mentor Summit
 * We need to push GHOP patches to main repository
 * Discussion how to get people to help us with GHOP features and GHOP issues
 * Discussion regarding code samples URLs in StudentProject model and generating links to code samples on Orgs home pages (we won't be doing that)
 * Melange Developer Meeting hopefully in December
 * We will try to use hg log for release notes
 * Pawel updated Google App Engine, created new release and reviewed Mario patch
 * CSV export that Pawel was working on is coming soon to the repository near you
 * We decided that we will be doing incremental fixes for GHOP code (Lennie will push the code ASAP)
 * Sverre was working on profiling and fixing caching issues
 * Lennie was away didn't work on Melange
 * Mario was working on Issue 201, 
 * Mario thinks that jqgrid seems to be more powerful and customizable, he will show demo integration by 28th of September
 * Models conversion script and view (HTML page) will be worked on after GHOP code is in the repository
 * Sverre will do the release this upcoming weekend
 * During the next conference call we will prepare a list of tasks that we can handle to casual contributors
 * Small discussion regarding KML export (fetching all User entities is bad :-)
 * Pawel will help Daniel with KML export
 * 4th of October data model conversaion deadline
 * Lennie will work on data model conversation HTML page web UI
 * Lennie will work on GHOP patches
 * Sverre will work on caching if anything comes up, model conversion help and access checks in Statistics module

== 31 Aug 2009 Team Conference Call Agenda == 

* Chaired by:* Pawel Solyga<br/>
* Notes taken by:* Sverre Rabbelier<br/>

  # Recollection of last week's work
  # Discussion regarding models conversion
  # Melange profiling
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 31 Aug 2009 ===

 * Pawel was working on cvs exporting scripts for code.google.com, he will commit it soon
 * Pawel's mac was out for repair for over 3 weeks
 * He also worked on fixing the survey exports (adding a link_id and comments column)
 * Recent export was mailed yesterday, recent code will be committed soon
 * Patches were not reviewed yet, but exports and cvs exports took priority, will be done asap now
 * Mario is having connection problems again (very laggy)
 * Sverre has been working on profiling and optimizing Melange together with Jake McGuire
 * Sverre will ask Jake to create a wiki page with how to use the profiler
 * Madhusudan has been working with Lennard on integrating GHoP, all logic and templates have been committed
 * All view helpers have been committed, and the goal is to commit the last view logic by next week
 * Madhusudan will be taking a break next week due ot his GRE (not available for next conf call).
 * Mario has committed JSLint patches and is now comparing datatables and jqgrid for issue 201 (ajaxy table list)
 * General rejoicing over working towards getting issue 201 resolved
 * We have JSLint checks in place (along with pylint)
 * About 201 both projects seem useful, with jqgrid seems more powerful on inplace editing of rows
 * Daniel worked on KML exporting (since the initial script didn't work well), new version has been mailed
 * Pawel will also review the export script soon
 * Table discussion wrt model conversion till next week when Lennard gets back
 * Sverre will continue to work on optimizing and will work with Lennard on model conversion when there is time
 * Pawel will do code reviews and will work with on model conversion with Lennard and Sverre
 * Madhusan will work on finishing integration of the GHoP code
 * Mario will probably be offline on September 2nd (travelling back to Italy for two exams on 15 and 21). 
 * Further he is going to work on 201, and probably with statistics stuff (possibly shrinksafe and jslint)
 * Daniel will work on integrating the statistics code as soon as we pick a date
 * Scheduled: meeting to discuss statistics integration now that Sverre is back in UTC+2
 * No preference for Daniel as to when we hold that meeting
 * Mario will have limited time due to travelling, but 3, 4 or 6 september; or tomorrow late afternoon
 * Picked a date: Sunday regular meeting time on #melange (6PM UTC, 8pm UTC+2)

== 24 Aug 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Daniel Hans<br/>

  # Recollection of last week's work
  # GSoC Integration Briefing/Update
  # KML Export update by Daniel
  # Update on the move to the module system
  # Update to the latest SDK Release
  # Task assignment for the upcoming week
  # Round of questions

=== Meeting notes 24 Aug 2009 ===

 * ALL Melange Google Summer of Code passed final evaluations! :-)
 * Madhusudan sent some comments to the review of his patches
 * Daniel finished working on KML export
 * Paweł is going to: update SDK to 1.2.4 release and push a new Melange release this week
 * Some of the conference participants had connections problems with Skype; the Melange team considered trying  out some other solutions in the further calls
 * Lennie said he would not be available from the following Monday through Wednesday due to his school obligations
 * Sverre and Pawel will work with Mario and Daniel on integrating the statistic module to the Melange repository
 * Lennie will work with Madhusudan on integrating his code
 * Lennie will also work on issues 672 and 385 from the Melange issue tracker
 * Pawel will review Mario's patch JSLint patch which reduces sizes of JavaScript files
 * James has to talk with Sverre about his news feed patch which he wants to submit as a series of Mercurial Queues patches
 * Pawel will write a script to create a cvs export that can be used to create the GSoC projects on Google Project Hosting.

== 18 Aug 2009 Team Conference Call Agenda == 

* Chaired by:* Pawel Solyga <br/>
* Notes taken by:* Daniel Hans<br/>

  # Recollection of last week's work
  # GSoC Student Status Update
  # GSoC Final Evaluations
  # Tasks assignment for the upcoming week
  # Contributing to Melange after GSoC
  # Round of questions

=== Meeting notes 18 Aug 2009 ===

 * Pawel came back from his vacation (welcome back! :-)
 * Daniel fixed some bugs in visualizations and added new option to change size of visualizations
 * Daniel prepared a new series of patches in accordance with Sverre's comments and suggestions
 * Daniel is now working on KML exporting
 * Mario also worked on bug fixing and refactoring his code - he sent his patches to the mailing list and is waiting for response from the developers)
 * Mario sent some patches which introduced JSLint in order to reduce sizes of JS files
 * Mario worked on exporting a visualizations as JS code - now one can paste some code on his site and a visualization will be displayed on his or the external website.
 * Madhusudan also worked on bug fixing and new patches
 * Madhusudan introduced some new features to the GHOP module (for example student grade added when a student is at high school, student type for students)
 * Madhusudan created a new wiki page with user manual for using the GHOP module for Melange
 * All GsoC students updated their demo instances
 * Pawel asked GSoC students if they want to participate in Melange development in the future. As I understand we all want :-)
 * Pawel will talk to Lennie on what is needed to be done in the upcoming weeks
 * Pawel will replay to the mailing-list letters received while he was on vacation

== 10 Aug 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk <br/>
* Notes taken by:* Sverre Rabbelier <br/>

  # Recollection of last week's work
  # GSoC Student Status Update
  # GSoC Final Week Goals and Wrap Up
  # New Melange release
  # Tasks assignment for the upcoming week
  # Round of questions

=== Meeting notes 10 Aug 2009 ===

 * Pawel is on vacation
 * Sverre has had little to no time last week
 * Lennard made it possible for admins to see the replies to surveys
 * Daniel has been working on 'visualize link' page, doesn't work perfectly on dashboard page
 * Mario has agreed to work on that
 * Daniel has worked on new patches, Sverre will try to review (or at least answer the question there in) today
 * We want access checks to be changeable, default should be highest level
 * James has been refactoring the newsfeed code (now including tests!)
 * Plan is to implement PubSubHubub this week
 * He also worked on a new patch for the mail dispatcher this week
 * Mario mostly worked on the bugfixes for the Dashboard
 * There are some problems with the JSON format (backend expected string instead of a number)
 * Also did research on how to seperate our HTML and JS (templating), will send an email to the list
 * Statistic export is a popup box that shows copy/pasteable code for inclusion in blogpost
 * Madhusudan worked on supporting selecting Task Type and difficulty level tags while creating/editing tasks
 * Started work on Task search filter, but stalled (for now) due to GAE limitations
 * Other than that it is mostly bug fixing
 * We expect all student's code to be submitted to the ML by the and of GSoC
 * All demo instances should be up to date (as well as the wiki page listing demo instances)
 * Sverre did a new release yesterday, Lennard or Sverre will do the next release
 * We want to have the models converted before GHOP to prevent pain later
 * Lennard will work out a schedule once the wiki page is updated

== 3 Aug 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk <br/>
* Notes taken by:* Sverre Rabbelier <br/>

  # Recollection of last week's work
  # GSoC Student Status Update
  # New Melange release
  # Tasks assignment for the upcoming week
  # Round of questions

=== Meeting notes 3 Aug 2009 ===

 * Last week, student to mentor maps online
 * Popular feature
 * We have started with an overview link for org admins to see whether mid-term/end-term surveys have been taken
 * Skype is a PITA as usual
 * Daniel was working on the last few things on his personal goals (multiple visualizations per widget)
 * New patches will be sent on Wednesday/Thursday
 * Lennard voices concerns about access control to widgets
 * Mario has been working on making it possible to integrate statistics in blog posts etc.
 * Important goal for statistics: access control (the docs access checks are probably reusable)
 * Madhusudan's task flow is working, he has a few bugfixes left
 * Sverre is doing the next release
 * We might want to update getForFields to allow for specifying multiple ancestors
 * Mario will start new thread about seed_db
 * Thread about modularization has fallen silent


== 27 Jul 2009 Team Conference Call Agenda == 

* Chaired by:* Pawel Solyga <br/>
* Notes taken by:* Lennard de Rijk <br/>

  # Recollection of last week's work
  # GSoC Student Status Update
  # New Melange release
  # Tasks assignment for the upcoming week
  # Round of questions

Absent: Madhusudan C.S. and Leslie Hawthorn

  # Pawel has been working CSV export for both Surveys and Student Projects. This code is currently being cleaned up and will be committed before the end of the week.<br/> Lennard has fixed Issue 655 and has been working, with Mario, on reorganizing the map that links Students and Mentors together. The stored locations for students, mentors and org admins will be changed using remote_api to city level.
  # Mario has been working on dynamically changing the type of visualization for your statistics, currently there are four different types. However it is easy to add additional types of visualization.<br/> James has been working on getting his NewsFeed code ready and working on the Survey Record view page.
  # A new Melange version has been successfully deployed by Pawel on the 27th of July. The changelogs will be updated shortly by Sverre.
  # Lennard will be creating this week's release and will continue his work with Mario on the Organization home page map which might actually be finished this week. Also he will work on listing survey information on the Project manage page for org admins.<br/> Pawel will finish his CSV export and will commit an early version of the File model for others to comment on.<br/> Sverre will update the latest changelog this week and work on a view for the administration team to withdraw students from the program. Also Daniel has asked Sverre to review a set of patches. Sverre acknowledged Daniels request to review them within a few (3-4) days.
  # We decided that Skype is very unstable :).

== 20 Jul 2009 Team Conference Call Agenda == 

* Chaired by:* Pawel Solyga <br/>
* Notes taken by:* Sverre Rabbelier <br/>

  # Recollection of last week's work
  # GSoC Student Status Update
  # Task Queue API usage examples
  # New Melange release
  # Tasks assignment for the upcoming week
  # Round of questions

=== Meeting Notes 20 Jul 2009 ===

	* Absent: Leslie, Madhu, Mario
	* Pawel did not have much time
	* Worked on nag mails with Lennard
	* Will work on file model this time
	* Sverre fixed tests
	* Did code review
	* Sverre will try to be more responsive to our students
	* Daniel mostly worked on the backend side of the statistic module (more generic)
	* Adding new statistics will need little to none code changes (see blog)
	* Almost all (backend) goals will be achieved this week
	* Daniel will try to synchronize with Mario
	* James just received a code review
	* Next step is an email notification (including access and preference check)
	* Blog post from James will follow soon
	* Good news, ApplicationError 1 should be history
	* New module for tasks committed by Lennard
	* No new release yet because there were only a few bug/style fixes
	* Release postphoned till we have something substantial to push
	* James will try to get the survey stuff ready (wrt final survey)
	* Sverre will have a meeting with James to discuss things

== 13 Jul 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Pawel Solyga <br/>

  # Missing notes from 7th of July
  # Recollection of last week's work
  # Survey improvements before Final Evaluation
  # Exporting Survey Answers (and other files?)
  # Survey Processing update
  # GSoC Student Status Update
  # New Melange release
  # Tasks assignment for the upcoming week
  # Round of questions

=== Meeting Notes 13 Jul 2009 ===

Missing notes from 7th of July
  * Leslie will post notes soon
  
Recollection of last week's work
  * Lennie was working on nag emails and automatic evaluation of surveys,
  * Sverre and Pawel had a meeting about Statistics Project final goals,
  * Pawel was been working on new org propery in ProjectSurveyRecord and GradingProjectSurveyRecord and remote_api function for setting that property in all entities, also worked on possible csv export solutions for Survey results, code reviews, fixing GSoC mentors/students accounts on socghop

Survey improvements before Final Evaluation
  * Org admins should be able to see which students and mentors filled in and didn't fill in the survey,
  * Org admins should be able to see survey content for each student and mentor,
  * this should be easier to achieve with new org property in ProjectSurveyRecord and GradingProjectSurveyRecord
  
Exporting Survey Answers
  * Mario suggested to look at http://jquery.tiddlywiki.org/twFile.html,
  * Sverre suggested to use document.write,
  * Pawel explained how Task Queue API can be used to create files up to 10 Mb of size and suggested new File model for that,
  * CSV export of all StudentProjects with pass/fail column is needed for GOSPO team to determine who to pay midterm money (Pawel will work on that)
  
Survey Processing update
  * we are almost there,
  * the tasks needed for that are ready and committed to the repository,
  * Lennie said he needs one more day to test it and run it on socghop

GSoC Student Status Update
  * Madhusudan posted a blog post about the progress,
  * Daniel posted a blog post about the progress,
  * Mario and James will blog post about the progress soon,
  * Pawel will review the Tags patch,
  * Daniel/Pawel will talk about KML generation using new File storing mechanism,
  * Mario and Daniel are happy with Stats project final goals,
  * Mario is busy with exam this and next week (so work time is limited),
  * Google Chart API will be used to generate static images in Stats project,
  * Daniel has some problems with creating patches in Mercurial (Pawel can assist),
  * James met with Sverre this weekend to discuss News Feed module
  
New Melange release
  * Sverre did a release this week,
  * Pawel will do a release at the end of the week,
  * Lennie will do release today and probably tomorrow with new features needed for Surveys

Tasks assignment for the upcoming week
  * Pawel will be working on new File model and module to save files using tasks
  * Pawel will work on StudentProject csv export using remote api
  * Lennie will be working on Surveys/Student Project update, 
  * Lennie will send Leslie the report who didn't fill in the survey yet,
  * Sverre will fix broken tests,
  * GSoC students will continue to work on their projects :-)
  * Next week lets work on unique user ids support, this should be put on agenda,
  * James will work on the view for Org admins to see ProjectSurveyRecords and GradingSurveyRecords,
  * James will finish Issue 653 (they will update the issue Owner),
  * Pawel suggested that we should show "Survey saved." and he will create an issue for that,
  * Mario will work on Issue 655


== 7 Jul 2009 Team Conference Call Agenda == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Leslie Hawthorn? <br/>

  # Recollection of last week's work
  # GSoC Surveys TODO's
  # GSoC Student Status Update, are you ready for reviews?!?
  # New Melange release
  # Someone named Ajaksu?
  # Tasks assignment for the upcoming week
  # Round of questions

=== Meeting Notes 7 Jul 2009 ===
TBD

News Feed: 
 * Module will be posted for code review on July 7th.
 * Demo will be ready on July 7th, on http://jamstage.appspot.com
 * Going to talk to Daniel Hans (and use the new Tasks wiki page) for Tasks integration.
 * Note: let James know if you have any new newsfeed feature requests

== 29 Jun 2009 Team Conference Call Agenda == 

* Chaired by:* Pawel Solyga<br/>
* Notes taken by:* Lennard de Rijk<br/>

  # Recollection of last week's work
  # GSoC Surveys Battle plan
  # GSoC Student Status Update
  # New Melange release
  # Tasks assignment for the upcoming week

=== Meeting Notes 29 Jun 2009 ===

Meeting took place on IRC due to technical difficulties with skype.<br/>

* Attendees:* Daniel Diniz, Daniel Hans, James Levy, Lennard de Rijk, Leslie Hawthorn, Madhusudan C.S., Mario Ferraro , Pawel Solyga, Sverre Rabellier

The logs start here: http://www.thousandparsec.net/~irc/logm/%23melange.2009-06-29.log.html#t2009-06-29T15:12:04 <br/>
The logs end here: http://www.thousandparsec.net/~irc/logm/%23melange.2009-06-29.log.html#t2009-06-29T16:25:48 <br/>

Survey TODO list:
  * Clean up Survey view main module (Ajaksu, 24h)
  * Make sure creation for Grading and ProjectSurvey work (Lennard, 48h)
  * Show view should only show the survey, take view needs to be added to take a survey. (James, reviewed by Sverre, 24h)
  * Project and Grading surveys need to be administered through the new take view (Lennard)
  * Results view needs to be introduced to list all results for one survey. URL pattern including %(key_fields) should do the trick. Read-access only? (None)
  * Fixing layout(CSS) and JS issues (Mario)
  * Create access check for taking a survey similair to Documents (James and Sverre, 48h)
  * Code Reviews (Pawel, throughout the week)
  * Code Testing + reporting failing/missing functionality (Pawel, throughout the Week)

Pawel will be given a more specific task within a few days when the code has cleared up.

Availability upcoming week: <br/>
  * Sverre 2h/day
  * Pawel 4h/day till Friday
  * Lennard 8h/day from Thursday, sporadic untill Wednesday
  * James ?
  * Ajaksu ?

Next release will be cut by Sverre Rabbelier during the Weekend if he deems a revision fit enough for it. Will update the list with his decision.

GSoC Students, on target updates can be found on http://melange-dev.blogspot.com/

== 22 Jun 2009 Team Conference Call Notes == 

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Leslie Hawthorn<br/>
* Attendees:* Daniel Diniz, Daniel Hans, James Levy, Lennard de Rijk, Leslie Hawthorn, Madhusudan C.S., Mario Ferraro , Pawel Solyga

Round the Room (updates from the last week):
  * Pawel: updating to Django 1.0, will cut a new release on Friday
  * Lennard: cut new release this week, fixed issues
  * James Levy: been working on surveys with Daniel Diniz, see mailing list discussion with James Crook et. al on models
    * most features needed for midterm surveys complete, update required to make pass/fail question activate automatically vs. admin intervention
    * more testing needed
    * working on nag notification emails as described in [http://code.google.com/p/soc/issues/detail?id=639 Issue 639]
  * James also some issues/work for review on newsfeeds but surveys taking priority
  * Merio: having meetings and posting notes to the dev list, keeping notes on to do's in the issue tracker, working on integrated test suite and adding exclusion example
  * Daniel: working on backend of statistics module and working on more sophisticated stats where we do not have pre-determined outcomes (e.g. % of students seeking a PhD degree vs. % of students who are attending the University of Delft), also add in functionality for create/delete/list
  * Madhu has made it possible to create a GHOP program, all features as described on the wiki page are now implementable but in progress, we have a task quota per org, can create tasks, views of assigned slots but is not using tasks API
  * Open question: do we need another student model for GHOP?
  * LH to look for "trusted testers" of midterm survey functionality
 
General Point about Surveys: 

In an ideal world:
  * there is a checkbox so that students can share their surveys with the mentors
  * mentors can share their surveys with their students
In the real world:
  * Org admins should have access to all surveys for their org. 
  * Program admins should have access to all surveys for a given program.

== 22 Jun 2009 Team Conference Call Agenda == 

  # Recollection of last week's work
  # GSoC Surveys status update/discussion
  # GSoC Student Status Update
  # GSoC Map on organization home page
  # New Melange release
  # Changes within Melange (New Project Lead)
  # Tasks assignment for the upcoming week

== 16 June 2009 Team Conference Call ==

=== Call Agenda ===

* Chaired by:* Lennard de Rijk<br/>
* Notes taken by:* Sverre<br/>
* Attendee's:* Pawel, Lennard, Sverre, Merio, (Late: Ajaksu, Daniel, James)<br/>
* Absents:* Leslie(Meeting), Dan Bentley(Work), Daniel Hans, Madhusudan(Exams)<br/>

  # Recollection of last week's work
  # GSoC Surveys status update/discussion
  # Document-like per entity rights dicussion in repsonse to mail from James Crook (http://groups.google.com/group/melange-soc-dev/browse_thread/thread/7db2f2e52c23fdb0)
  # GSoC Student Status Update
  # New Melange release
  # Tasks assignment for the upcoming week

=== Call Notes ===

 # Biggest change is fix for broken student page (ninja release)
 # Pawel was at WWDC
 # Sverre completed bachelor project
 # Slow week, not much change
 # Pawel was concerned that Document Access control might not work for surveys, however the three different kinds of access currently available for surveys (read, write, submit) will cover the necessary access control requirements.
 # Pawel will reply to James Crook's access control mail
 # Mario went to a conference (which was great)
 # Daniel joined the call
 # Mario met James and they produced an architecture for the Python end to handle customised statistics
 # Mario met up on IRC today with Daniel and got working on merging their code
 # Plan for this week is (for Mario) to start on python code (might need some help)
 # Mario and Daniel will have regular daily IRC meetings starting from today (a quick summary will be posted to the list/wiki)
 # James joined the call
 # Mario will be happy with his progress once his code is merged and he has more python done
 # James made some good progress with newsfeed but some things have come up (mostly access related)
 # James is also working on surveys a lot because they need to be done soon
 # PubSub would be interesting but low priority (post mid-term)
 # Surveys is well on it's way to being done (since James is taking on multiple students per mentor part)
 # Ajaksu is fixing small bugs and layout related things
 # Leslie will give some feedback on the surveys
 # Before the weekend the surveys should be feature complete
 # Ajaksu will start submitting patches for the stable parts of surveys
 # No release because there were no changes after the ninja release
 # Lennard will be doing the release this weekend on Sunday, hopefully incorperating code from Surveys
 # Lennard is working on his report for bachelor thesis, so he will be busy for the next 2.5 weeks still
 # He will still try to review as much code as possible and get the surveys bug free
 # Pawel is going through some issues in the tracker that are assigned to him
 # He will also go over the survey code and test it if possible
 # Mario and Pawel will also catch up and get the code reviewed
 # We do not have to wait to write code for the Task API
 # Sverre will be off the map till next Monday but will be reading his mail and on GTalk on his G2 (Ion)
 # Google I/O > WWDC (because: free phone!)
 # Keep up the good work!
 # Sverre will mail Dan Bentley to make an appointment to get up to speed with Hg

== 8 June 2009 Team Conference Call ==

=== Call Agenda ===
Short update on work progress of the development team and specifically the students.

=== Call Notes ===
Attendees: Sverre Rabbelier, Dan Bentley, Lennard de Rijk, Mario Ferraro, Madhusudan C.S.

Absents:
Pawel Solyga, Daniel Hans, James Levy

* Developers *
Sverre Rabbelier:
  * Busy with his final bachelor thesis
  * Tweaked the module design to facilitate the problems that Madhusudan ran into regarding circular imports. ([http://code.google.com/p/soc/source/detail?r=4f87bab3c r4f87bab3c])
  * Fixed error pages to show HTML output directly instead of redirecting to static page. ([http://code.google.com/p/soc/source/detail?r=7fe19ebfe0 r7fe19ebfe0])

Dan Bentley:
  * Wants to do patch reviews! Sverre will redirect some of his work to him.
  * Sverre will help him out with "Hg 101"

Lennard de Rijk:
  * Fixed Issue 271 and Issue 630.
  * Has reviewed several patches of Madhusudan regarding his GSoC project.
  * Also busy with final bachelor thesis.

*GSoC Students*

Daniel Hans:
  * Has not been much visible communication.
  * Merio received mail to discuss the JS layer with him. They decided to meet up on IRC for this, no reaction since 6th of June.

James Levy:
  * Working on newsfeed framework regarding news collection. Trouble regarding documents using temporary work arround for missing scope values. Lennard suggest that this be fixed (Issue 637).

Mario Ferraro:
  * Update on http://groups.google.com/group/melange-soc-dev/browse_thread/thread/3d5d2d38f95365d8
  * Working on basic JS framework for statistics.
  * The JS skeleton is in place needs about 1-2 days more work.
  * Added JSUnit framework and sample testcases to his repository.
  * Wiki has been updated about the use of the tools that have been added to his repository.
  * Will be AFK for the next 3 days due to attending a conference.
  * The skeleton JS framework needs to be finished before Mario can attempt Python code, further framework discussions should happen this week. Python should follow soon after.

Madhusudan C.S.:
  * Update on http://melange-dev.blogspot.com/
  * Working on several views. Program View patch has been submitted and will be updated.
  * Will take a break next week for final bachelor exams, from 12th of June till 19th of June. Will post summary before leaving on the 12th. After exams it's gonna be 120% `^_^`.

*Additional*
Sverre will mail Daniel and James about conference call and summary.
Lennard will post notes hurray!
Feel the love...?



== 1 June 2009 Team Conference Call ==

=== Call Notes ===
  * All students need to publish status updates on the [http://melange-dev.blogspot.com Melange Developer Blog] by tomorrow
    * It's fine to post a link to posts you've already written for your personal blog.
  * Pawel has reviewed Zachary Voase's Paver build script, needs to do some style fixes to it, is also waiting for some feedback from Zachary but overall script looks good
    
  * Developer To Do's This Week
    * Sverre will be working on reviewing work on Statistics Module and Surveys this week, as well as James Levy's forthcoming work on News Feeds. Sverre will be doing a release on Wednesday, gated by Pawel fixing Maps bugs (see next point)
    * Pawel is working on fixing the bug in our patch to display maps on organization pages, will be debugged/fixed by Wednesday or front end code will be backed out so Sverre can do a release
    * Lennard is busy through 1 July so will be focusing exclusively on mentoring Madhusudan

  * GSOC Developer To Do's This Week
    * James Levy is working on News Feeds, will update the wiki page spec and ask for feedback on the developers list once page is updated; James is working on surveys with Ajaksu and learning how to use Mercurial (aka hg); Sverre available to help with hg questions
    * Madhusudan wonders if taggable will be checked in today. Pawel sez yes, within 2 hours of call; Pawel is committing an extension that allows different tagging models and will post an email to the developers list explaining how to use taggable.
    * Mario will be working on JavaSscript stuff some more for the next 2-3 days. Will be moving more onto the Python coding side after that.
    * Daniel needs his code reviewed before he can make progress. Sverre will try to get to it by Wednesday, Pawel has committed to reviewing by Wednesday.

  * Madhusudan wants to know if he should put his code into soc.modules now or later; Sverre says _sooner_ so we can find any errors/problems early. (Release Early, Release Often! :)
  * James Levy wonders where URL patterns went. Sverre is sending an email to the dev list with details. Short answer:  soc.modules.soc_core.callback.
  

=== Call Agenda ===

  # GSoC Status update blog posts
  # Paver build script discussion
  # Tasks assignment for the upcoming week
  # New Melange release


== 18 May 2009 Team Conference Call ==

Attendees: Dan Bentley, Madhusudan CS, Mario Ferraro, James Levy, Sverre Rabbelier, Lennard de Rijk 

Absent: Daniel Hans, Leslie Hawthorn

=== Call Notes ===

*Summary*
  # Unique user ID's will be fixed this week by Pawel
  # All GSoC students will be given Project Membership Access. Their patches will still need approval before they may be pushed. The main reason for giving access is that issues can be assigned to them.
  # GSoC Students will need to get their own AppEngine instance so that they can push their own code. The students will be given developer access on melange-dev aswell so they can experience what's going on. 
  # Lennard unfortuneatly will not complete the assigned test due to other project and university obligations, Sverre is helping out the students with writing test as expected and also working on refactoring Melange. James is working on surveys, Merio is working on seed_db and Madhu has just submitted a patch for adding Organization logic tests.
  # Survey patch will be rebased shortly after the meeting and will then be reviewed by Sverre. According to James the surveys are on track for a solid test run at the end of the week (24th of May).
  # The all-hands meeting agenda will be posted on the discussion group by Pawel. It will contain references to all the issues in the tracker that need to be discussed. Other items can be suggested/added as well.
  # The new release/development progress was in need of discussion thanks to the move to HG. Making multiple heads seemed to be favored above branching. Augie will be mailed by Sverre for information.
  # Dan's patch is not complete yet, however it will not be worked on before the all-hands May meeting so that we might discuss any other viable solutions
  # The ajaxy list view will be discussed during the all-hand May meeting. James and Merio have expressed interest in it's design they will be added to the meeting when/if that's possible.
  # Taggable seems a favorite, Lennard still needs to take a good look at the systems. This will be discussed further during the all-hands May meeting.
  # James is working on surveys expected to have something well-testable by the end of the week. Merio is working with Pawel on seed_db something should be up and running by the end of the week. Madhusudan has just submitted a patch including tests also he's fleshing out the wiki pages regarding GHOP. Our students seem to be happy but they were quiet in Skype :D.

*All-hands May*

Items certainly on the agenda are:
  * GSoC Survery progress, do we feel ready for it?
  * Plan to make Melange modulair.
  * Ajaxy list, experiments will be done by Pawel that week. (In combination with the 1000 entity fix)
  * Discussion about which system to use for tags, Taggable seems a favorite. 

*Misc*
  * Seed_db can be called by using the devvin as version name.
  * Daniel is working on GSD so that he can fully focus on GSoC from the 23rd.
  * James will be in SF aswell during Google I/O

*Action Items (Deadline)*
  * Pawel will submit fix for unique User ID's (24th of May)
  * Pawel will send an email about commit access for our students (18th of May)
  * Pawel will send an email to open the discussion about the all-hand agenda (18th of May)
  * James will rebase his survery work on Sverre's Git repo (18th of May)
  * Sverre will mail Augie if the new release process suits a HG-controlled project (18th of May)
  * Lennard will look at the different tagging systems (24th of May)

=== Call Agenda ===

  # Unique user ID's discussion (when we plan to implement that)
  # Commit access for GSoC students
  # Developer access to testing instances for GSoC students
  # Testing month status update
  # Surveys module patch review
  # Agenda for all-hands meeting
  # New release and Melange Development Process using hg (branches, tags)
  # Update from Dan about his work on 1000 limitation patch
  # ajaxy list view discussion
  # Tags support
  # GSoC Community Bonding period status update


== 4 May 2009 Team Conference Call ==

Attendees: Dan Bentley, Madhusudan CS, Mario Ferraro, Daniel Hans, Leslie Hawthorn, Sverre Rabbelier, Lennard de Rijk 

=== Call Notes ===

  * 1000 entities fix:
    * Dan working on learning Hg
    * Discussion of indexing - specific index for each query, noted exploding indexes problem
    * Timestamps vs. Names are confusing for users
    * Team needs to sync up regarding Ajaxy List views
  * Dan is checking on application errors when sending out mass emails (e..g. when students are accepted)
  * Testing Meeting recap - notes will be sent out (Pawel)
    * Need a getting started testing page to document the common challenges when doing testing for Melange
      * diones on IRC created a document on getting pylint working in Eclipse, should be pointed to from this wiki page
  * Summer of Coder check in
    * Madhu is comfortable getting started
    * Daniel has some questions, emailed them to Sverre
    * Mario is comfortable working on the JavaScript side of Melange, working on getting up to speed in other areas of the code base
    * Sverre had first meeting with James Levy and will publish pointer to logs
    * Pawel will follow up with Daniel and Mario early this week to provide guidance on stats module
  * Team All Hands Meeting at end of May: working session topics
    * Discuss refactoring Melange to better support multiple programs
    * Summer of Code check-in
    * Usability: how will we get help in this area, options for UI
    * Ajaxy List View and Survey Modules update
  * Dan will check his schedule to see if he can being all hands meeting on 24 May
  * Roadmap Owners
    * Sverre: Survey support, Testing, feed support
      * private feeds on dashboards are a good point for all Summer of Code students to collaborate
    * Lennie: (on list) clubs support, GHOP items
   * Lots of patches have come in - Dan Bentley is available to help with patch reviews

=== Call Agenda ===

  * 1000 entities fix (need Dan Bentley for this conversation)
  * Testing Meeting Review (quick sync - do we feel good about current plan? follow up meeting needed / planned?)
  * Summer of Coder project update
    * James & Madhusudan have had initial meetings, Daniel and Merio status updates
  * Team All Hands Meeting in 3 weeks: goals, agenda, planning
  * Roadmap needs granular owners - [http://groups.google.com/group/melange-soc-dev/browse_thread/thread/41a220951ce2c8bf/677cef96e5700953#677cef96e5700953 discussion]?
  * Outstanding Patch Reviews
    # [http://code.google.com/p/soc/issues/detail?id=172 Issue 172] - Date picker (blocked on 263)
    # [http://code.google.com/p/soc/issues/detail?id=263 Issue 263] - IE tooltips
    # [http://code.google.com/p/soc/issues/detail?id=227 Issue 227] - JS help windows
    # [http://code.google.com/p/soc/issues/detail?id=505 Issue 505] - Make student proposal public check box option (patch needs work - what's status?)
    # [http://code.google.com/p/soc/issues/detail?id=538 Issue 538] - Subscriptions to proposals
    # [http://code.google.com/p/soc/issues/detail?id=569 Issue 569] - Clicking cancel returns to previous view (patch just received)
    # Latest patches from Matthew Wilkes (came in yesterday)


== 28 April 2009 Google Summer of Coder Intro Meeting ==

=== Meeting Logs ===

Meetings starts here
http://www.thousandparsec.com/~irc/logm/%23melange.2009-04-28.log.html#t2009-04-28T14:12:55

and ends here
http://www.thousandparsec.com/~irc/logm/%23melange.2009-04-28.log.html#t2009-04-28T15:11:00

== 28 April 2009 Google Summer of Coder Intro Meeting Agenda ==

18:00 UTC in #melange on Freenode

  * Students will be asked to introduce themselves to the community and provide a brief overview of their projects.
  * Mentors will briefly introduce themselves too and we will also let students know who is co-mentoring each project
  * We will discuss expectations for community bonding period, coding period, etc.; things like status reports, help with testing, etc.
  * We will discuss GSoC students participation in Melange Weekly Monday Conference calls
  * We will ask GSoC students whether they can participate in Wednesday Testing Meeting on #melange
  * Following this meeting, mentors should reach out to their student via the dev list to schedule a more in-depth first meeting. If anyone wants to drop to watch the IRC meeting, they are welcome to do so, hence scheduling on the dev list.


== 27 April 2009 Team Meeting ==

=== Call Notes ===

  * Tabled for next meeting:
    * 1000 entities fix (need Dan Bentley for this conversation)
    * Where to get help on thinking about security

Action Item: LH to get Dan's Skype ID to Pawel before next meeting.

  * We will be tagging issues with DueBy-MONTH-DAY-YEAR and we will never discuss this topic again since everyone is tired of it by now. Fortunately, we've now got it right.

  * We will use a tag with format ReviewBy-MONTH-DAY-YEAR to tag issues in the tracker that have patches attached so casual contributors know when they can expect their patches to be reviewed.

  * Discussion of more granular owners/leads for the tasks listed on the current roadmap will happen on the [http://groups.google.com/group/melange-soc-dev developers list]. Assigning owners and getting these areas fleshed out needs to happen sooner rather than later.

Action Item: LH will start this thread.

  * We will be spending the next month focusing on testing. An announcement will be sent to the dev list so any users/casual contributors know what our priorities are for the next month.

Action Item: Pawel will send announcement to the list. (done)

  * We want community help with testing! Specifically we need:
    * People to help write tests. (Our Summer of Code students will be working on this as part of their onboarding/community bonding.)
    * We would like someone who knows Python to add the Python coverage module to Melange. We will bribe with t-shirts or chocolates or a fine glass of iced tea.
    * Community members who would like to help with writing tests should talk to one of the developers on #melange to discuss ideas or send email to the [http://groups.google.com/group/melange-soc-dev dev list].
  * We currently have 40 tests ready, but no other test coverage. We need to give people a pointer to these tests. 
  * We will track tests in progress in the issue tracker. Issues for tests should be labeled as "Tests" for ease of tracking.
  * We will have a kick off meeting for the month of Melange testing on Wednesday, 29 April 2009 at 18:00 UTC in #melange.

Action Item: Pawel will schedule testing meeting. (done - [http://groups.google.com/group/melange-soc-dev/browse_thread/thread/ca435880649b7c0 announced on dev list])

  * Summer of Coder meeting tomorrow in #melange at [http://www.timeanddate.com/worldclock/meetingdetails.html?year=2009&month=4&day=28&hour=18&min=0&sec=0&p1=215&p2=16&p3=224 18:00 UTC].
    * Students will be asked to introduce themselves to the community and provide a brief overview of their projects.
    * We will discuss expectations for community bonding period, coding period, etc.; things like status reports, help with testing, etc.
    * Following this meeting, mentors should reach out to their student via the [http://groups.google.com/group/melange-soc-dev dev list] to schedule a more in-depth first meeting. If anyone wants to drop to watch the IRC meeting, they are welcome to do so, hence scheduling on the dev list.

Action Item: Pawel will create agenda for tomorrow's first student meeting. (LH humbly suggests it live on the wiki.) Pawel will also send a welcome email to all students with some "news you can use" following tomorrow's meeting.

Action Item: LH will call James Levy to make sure he knows he was accepted. (done - hi James!)

  * We want to get *a lot* better about reviewing and committing patches. Right now we are not doing this well enough. New strategy:
    # We quickly sync within 24 hours about who is going to review a patch.
    # All patches will be ack'ed within 48 hours, which means that we say at least "hey thanks we got your patch." Person ack'ing the patch is the person who will review it.
    # Patch will be reviewed *and* feedback sent to submitter *and* relevant issue in the tracker updated within 5 days (read: 120 hours).
    # If a patch does not meet our style guidelines, it will be returned to the contributor with a request to fix the style issues.
    # If patch passes review, it will be committed. If something breaks, the person committing the patch is taking responsibility to babysit the build.
    # If you take on reviewing a patch and you cannot get to reviewing it within 5 days of ack, it is your responsibility to let the contributor know about the delay *and* update the relevant issue in the tracker.
    # If you take on responsibility for reviewing a patch and cannot get to it within 5 days of ack, it is your responsibility to ask for help in getting it reviewed. It is entirely plausible no one is going to have time to help, but you should certainly ask for it.
    # Each mentor is responsible for reviewing his student's patches, following same process as above.

Action Item: All committers will follow process as detailed above.

Action Item: Pawel will review alll outstanding issues noted in the agenda, below,  by end of day Friday, 1 May. 

Action Item: LH will go through the issue tracker to make sure that no other outstanding patches are hiding in plain sight. Any outstanding reviews will be assigned to Pawel for action by Friday.

   * The [http://code.google.com/p/soc/wiki/GHOP GHOP specs] wiki page needs to be reviewed. We all do not want to have yet another meeting to discuss it unless we really need to have yet another meeting.

Action Item: LH will review the document after posting notes from today's conference call and provide any needed comments/edits, followed by a ping to the [http://groups.google.com/group/melange-soc-dev dev list] that this review has been done.

Action Item: All interested folks can take a look at the page and discuss further on the [http://groups.google.com/group/melange-soc-dev dev list]. If we need to schedule yet another meeting, LH will schedule it.

== 27 April 2009 Team Meeting Agenda ==
  * 1000 entities fix
    # related issue http://code.google.com/p/soc/issues/detail?id=357
  * Assigning granular owners to items in Roadmap
    # Other roadmap discussion items?
  * Month of Testing
    # Formal announcement
    # Who is handling what test creation
    # How can our Summer of Code students help here?
    # Related Issue: http://code.google.com/p/soc/issues/detail?id=5
  * Summer of Coder Meeting Preview - Pawel?
  * Patch Reviews
    # Seems like patches are waiting a long time for review. How can we fix this?
      # Related: http://groups.google.com/group/melange-soc-dev/browse_thread/thread/e89d8efaf903558d (7 days to ack)
      # http://code.google.com/p/soc/issues/detail?id=263 (submitted 28 Feb, still not committed?)
      # http://code.google.com/p/soc/issues/detail?id=172 (submitted 30 Jan, still not committed?)
      # http://groups.google.com/group/melange-soc-dev/browse_thread/thread/44523561cd61e96/2901360614f3b5de (submitted 18 Mar, still not committed?)
  * GHOP Features/Needs Data Dump Meeting
    # Lots of items on wiki page, need higher level overview for team - when?
  * Wiki Discussion for Issues
    # WikiDiscuss Label
  * Security Help
    # James Crook mentioned on list getting help from a security related org in Summer of Code. Any preference who we approach?


== 20 April 2009 Team Meeting ==

=== Call Notes ===
  * Everyone agreed that the current roadmap document (currently only available privately) is what we should be working from to flesh out activities for the next 9 months. Interested parties who are not project owners/members are welcome and encouraged to add their thoughts as comments to the roadmap.

Action Items:
 
Pawel will flesh out roadmap somewhat and publish on Melange project wiki. 

All should review roadmap when published in preparation for 27 April team conference call.

LH will add roadmap review to 27 April team call agenda.

  * We will add a due date for issues to each issue in the issue tracker and we can discuss issues in more detail on the wiki. James Crook is a good resource for talking to folks about effectively fleshing out design from various user issues.

Action Items:

LH will begin assigning due dates, which are of course negotiable, during weekly bug triage. [http://groups.google.com/group/melange-soc-dev/browse_thread/thread/22b6028b45cba979# Related mailing list thread].

  * We have on security issue that has been on file for a month. While users can do no harm even if they exploit the vulnerability, we agreed that we need to be more on top of security issues. Resolve within 2 days, even if that resolution is adding a note along hte lines of "We will fix this but cannot get to it right now. Delay ok'ed because users can do no harm" to the relevant security issue in the tracker.

Action Items:

The Melange team could use some help with security issues. LH will see if it is possible to get help from the security team at Google. (Unlikely, but I will ask.)

  * Caching stuff is a known issue. We need to update the documentation to reflect that users can expect behavior such as is detaied in [http://code.google.com/p/soc/issues/detail?id=473 Issue 473]

Action Items:

LH will update the documentation with this information and solicit technical review of the explanation, update relevant issues with pointer to the documentation.

(Note: If anyone would like to volunteer to take this action item, please do.)

  * Community bonding period (e.g. until 23 May) will be focused on onboarding Melange's Summer of Code students and creating tests for Melange. Patches will be reviewed, but no work on other features should be expected by the community during this time. Melange Summer of Code students will be asked to help with writing of these tests as part of the onboarding process.

  * Rather than updating documentation on error messages, we agree that error messages should simply be more useful. This topic tabled until our all hands meeting in May.


=== 20 April 2009 Team Meeting Agenda ===
  # Roadmap Discussion 
    * Ensure everyone has agreed to current roadmap
    * Discuss any additional priorities
    * Discuss timing/owners for fleshed out roadmap publication (27 April current target)
  # Student proposals after the deadline
  # Bug Triage
    * Do issues assigned to you need to be assigned elsewhere? If so, who?
    * How to accurately assess when we expect bugs to be closed.
  # Security Bugs
    * Discuss and agree on timing for closure of *all* security related issues. 
    * Related issue: http://code.google.com/p/soc/issues/detail?id=448
  # Caching Issues
    * Several open issues related to page refresh times - document as Known Issue with GAE and call it a day or no?
    * Sample issue: http://code.google.com/p/soc/issues/detail?id=473
  # Test Suite
    * Update from Sverre on access to machines running buildbot at OSU OSL
    * Plan to create tests. Timing? Owners? (This may be covered in roadmap discussion.)
  # Documenting Error Messages
    * This should be done. Timing? Owner?
  # Any Other Business

== 16 April 2009 - Roadmap Review Meeting ==
  * The roadmap discussed in these notes will be published on 20 April and when it is published it will be linked to here.
  * [http://groups.google.com/group/melange-soc-dev/browse_thread/thread/b62a064390f0de17 Call Notes]