#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 Leo 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 Thurday 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]