#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" />

== 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]