Merge branch 'master' of github.com:webnotes/erpnext

Conflicts:
	patches/patch_list.py
diff --git a/home/page/latest_updates/latest_updates.js b/home/page/latest_updates/latest_updates.js
index a3f3760..42408de 100644
--- a/home/page/latest_updates/latest_updates.js
+++ b/home/page/latest_updates/latest_updates.js
@@ -1,4 +1,8 @@
 erpnext.updates = [
+	["15th February, 2013", [
+		"Calendar: Added new FullCalendar, and Calendar Views",
+		"Leave Application: Added email notifications on Leave Application",
+	]],
 	["13th February, 2013", [
 		"Employee: If Employee is linked to a Profile, copy Full Name, Date of Birth, \
 			Image and Gender to Profile",
diff --git a/hr/doctype/leave_application/leave_application.py b/hr/doctype/leave_application/leave_application.py
index 0f8f21e..06652ad 100755
--- a/hr/doctype/leave_application/leave_application.py
+++ b/hr/doctype/leave_application/leave_application.py
@@ -216,4 +216,60 @@
 
 def is_lwp(leave_type):
 	lwp = webnotes.conn.sql("select is_lwp from `tabLeave Type` where name = %s", leave_type)
-	return lwp and cint(lwp[0][0]) or 0
\ No newline at end of file
+	return lwp and cint(lwp[0][0]) or 0
+	
+@webnotes.whitelist()
+def get_events(start, end):
+	events = []
+	employee = webnotes.conn.get_default("employee", webnotes.session.user)
+	company = webnotes.conn.get_default("company", webnotes.session.user)
+
+	add_department_leaves(events, start, end, employee, company)
+	add_block_dates(events, start, end, employee, company)
+	return events
+	
+def add_department_leaves(events, start, end, employee, company):
+	department = webnotes.conn.get_value("Employee", employee, "department")
+	
+	if not department:
+		return
+	
+	# department leaves
+	department_employees = webnotes.conn.sql_list("select name from tabEmployee where department=%s", 
+		department)
+	
+	for d in webnotes.conn.sql("""select name, from_date, to_date, employee_name, half_day, 
+		status, employee
+		from `tabLeave Application` where
+		(from_date between %s and %s or to_date between %s and %s)
+		and docstatus < 2
+		and status!="Rejected"
+		and employee in ('%s')""" % ("%s", "%s", "%s", "%s", "', '".join(department_employees)), 
+			(start, end, start, end), as_dict=True):
+			events.append({
+				"name": d.name,
+				"doctype": "Leave Application",
+				"from_date": d.from_date,
+				"to_date": d.to_date,
+				"status": d.status,
+				"title": _("Leave by") + " " +  d.employee_name + \
+					(d.half_day and _(" (Half Day)") or "")
+			})
+	
+
+def add_block_dates(events, start, end, employee, company):
+	# block days
+	from hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
+
+	cnt = 0
+	block_dates = get_applicable_block_dates(start, end, employee, company, all_lists=True)
+
+	for block_date in block_dates:
+		events.append({
+			"doctype": "Leave Block List Date",
+			"from_date": block_date.block_date,
+			"title": _("Leave Blocked") + ": " + block_date.reason,
+			"name": "_" + str(cnt),
+		})
+		cnt+=1
+	
diff --git a/hr/doctype/leave_application/leave_application_calendar.js b/hr/doctype/leave_application/leave_application_calendar.js
new file mode 100644
index 0000000..eebd559
--- /dev/null
+++ b/hr/doctype/leave_application/leave_application_calendar.js
@@ -0,0 +1,10 @@
+wn.views.calendar["Leave Application"] = wn.views.Calendar.extend({
+	field_map: {
+		"start": "from_date",
+		"end": "to_date",
+		"id": "name",
+		"title": "title",
+		"status": "status",
+	},
+	get_events_method: "hr.doctype.leave_application.leave_application.get_events"
+})
\ No newline at end of file
diff --git a/patches/patch_list.py b/patches/patch_list.py
index 478cb00..c0f53b3 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -171,4 +171,5 @@
 	"execute:webnotes.conn.sql('update tabUserRole set parentfield=\"user_roles\" where parentfield=\"userroles\"')",
 	"patches.february_2013.fix_outstanding",
 	"patches.february_2013.p01_event",
+	"execute:webnotes.delete_doc('Page', 'Calendar')"
 ]
\ No newline at end of file
diff --git a/utilities/page/calendar/__init__.py b/utilities/page/calendar/__init__.py
deleted file mode 100644
index baffc48..0000000
--- a/utilities/page/calendar/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-from __future__ import unicode_literals
diff --git a/utilities/page/calendar/calendar.js b/utilities/page/calendar/calendar.js
deleted file mode 100644
index 033e906..0000000
--- a/utilities/page/calendar/calendar.js
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com)
-// 
-// MIT License (MIT)
-// 
-// Permission is hereby granted, free of charge, to any person obtaining a 
-// copy of this software and associated documentation files (the "Software"), 
-// to deal in the Software without restriction, including without limitation 
-// the rights to use, copy, modify, merge, publish, distribute, sublicense, 
-// and/or sell copies of the Software, and to permit persons to whom the 
-// Software is furnished to do so, subject to the following conditions:
-// 
-// The above copyright notice and this permission notice shall be included in 
-// all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
-// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 
-// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
-// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-// 
-
-wn.provide("erpnext.calendar");
-
-pscript.onload_calendar = function(wrapper) {
-	
-	
-	
-	wn.ui.make_app_page({
-		parent: wrapper,
-		single_column: true,
-		title: 'Calendar'
-	});
-	
-	wn.require('lib/js/lib/fullcalendar/fullcalendar.css');
-	wn.require('lib/js/lib/fullcalendar/fullcalendar.js');
-}
-
-pscript.onshow_calendar = function(wrapper) {
-	if(!wrapper.setup_complete) {
-		erpnext.calendar.setup(wrapper);
-	} else {
-		$("#fullcalendar").fullCalendar("refetchEvents");
-	}
-}
-
-erpnext.calendar.setup = function(wrapper) {
-	wn.model.with_doctype("Event", function() {
-		$('<div id="fullcalendar">').appendTo($(wrapper).find('.layout-main')).fullCalendar({
-			header: {
-				left: 'prev,next today',
-				center: 'title',
-				right: 'month,agendaWeek,agendaDay'
-			},
-			editable: true,
-			selectable: true,
-			selectHelper: true,
-			events: function(start, end, callback) {
-				wn.call({
-					method: 'utilities.page.calendar.calendar.get_events',
-					type: "GET",
-					args: {
-						start: dateutil.obj_to_str(start),
-						end: dateutil.obj_to_str(end),
-						company: wn.user.get_default("company")[0],
-						employee: wn.user.get_default("employee")[0]
-					},
-					callback: function(r) {
-						var events = r.message;
-						$.each(events, function(i, d) { 
-							d.editable = d.owner==user;
-							var options = erpnext.calendar.event_options[d.doctype];
-							if(options && options.prepare)
-								options.prepare(d);
-						});
-						callback(events);
-					}
-				})
-			},
-			eventClick: function(event, jsEvent, view) {
-				// edit event description or delete
-				var options = erpnext.calendar.event_options[event.doctype];
-				if(options && options.click)
-					options.click(event);
-			},
-			eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
-				erpnext.calendar.update_event(event);
-			},
-			eventResize: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
-				erpnext.calendar.update_event(event);
-			},
-			select: function(startDate, endDate, allDay, jsEvent, view) {
-				if(jsEvent.day_clicked && view.name=="month")
-					return;
-				var event = wn.model.get_new_doc("Event");
-				event.starts_on = wn.datetime.get_datetime_as_string(startDate);
-				event.ends_on = wn.datetime.get_datetime_as_string(endDate);
-				event.all_day = allDay ? 1 : 0;
-				wn.set_route("Form", "Event", event.name);
-			},
-			dayClick: function(date, allDay, jsEvent, view) {
-				jsEvent.day_clicked = true;
-				$("#fullcalendar").fullCalendar("gotoDate", date)
-				return false;
-			}
-		});
-	});
-
-	wrapper.setup_complete = true;
-	
-}
-
-erpnext.calendar.update_event = function(event) {
-	wn.model.remove_from_locals("Event", event.id);
-	wn.call({
-		module: "utilities",
-		page: "calendar",
-		method: "update_event",
-		args: {
-			"start": wn.datetime.get_datetime_as_string(event.start),
-			"end": wn.datetime.get_datetime_as_string(event.end),
-			"all_day": event.allDay,
-			"name": event.id
-		},
-		callback: function(r) {
-			if(r.exc) {
-				show_alert("Unable to update event.")
-			}
-		}
-	});
-}
-
-erpnext.calendar.event_options = {
-	"Leave Block List Date": {
-		prepare: function(d) {
-			d.color = "#aaa";
-		}
-	},
-	"Event": {
-		prepare: function(d) {
-			if(d.event_type=="Public") {
-				d.color = "#57AF5B";
-			}
-		},
-		click: function(event) {
-			wn.set_route("Form", "Event", event.id);
-		}
-	},
-	"Leave Application": {
-		prepare: function(d) {
-			d.color = "#4F9F96";
-		},
-		click: function(event) {
-			if(event.employee==wn.user.get_default("employee")[0]) {
-				wn.set_route("Form", "Leave Application", event.id);
-			}
-		}
-	}
-}
-
diff --git a/utilities/page/calendar/calendar.py b/utilities/page/calendar/calendar.py
deleted file mode 100644
index 06d4385..0000000
--- a/utilities/page/calendar/calendar.py
+++ /dev/null
@@ -1,85 +0,0 @@
-from __future__ import unicode_literals
-
-import webnotes
-from webnotes import _
-
-@webnotes.whitelist()
-def get_events(start, end, employee=None, company=None):
-	roles = webnotes.get_roles()
-	events = webnotes.conn.sql("""select name as `id`, subject as title, 
-		starts_on as `start`, ends_on as `end`, "Event" as doctype, owner,
-		all_day as allDay, event_type 
-		from tabEvent where (
-			(starts_on between %s and %s)
-			or (ends_on between %s and %s)
-		)
-		and (event_type='Public' or owner=%s
-		or exists(select * from `tabEvent User` where 
-			`tabEvent User`.parent=tabEvent.name and person=%s)
-		or exists(select * from `tabEvent Role` where 
-			`tabEvent Role`.parent=tabEvent.name 
-			and `tabEvent Role`.role in ('%s')))""" % ('%s', '%s', '%s', '%s', '%s', '%s', 
-			"', '".join(roles)), (start, end, start, end,
-			webnotes.session.user, webnotes.session.user), as_dict=1)
-			
-
-	if employee:
-		add_block_dates(events, start, end, employee, company)
-		add_department_leaves(events, start, end, employee, company)
-
-	return events
-
-def add_department_leaves(events, start, end, employee, company):
-	department = webnotes.conn.get_value("Employee", employee, "department")
-	
-	if not department:
-		return
-	
-	# department leaves
-	department_employees = webnotes.conn.sql_list("select name from tabEmployee where department=%s", 
-		department)
-	
-	for d in webnotes.conn.sql("""select name, from_date, to_date, employee_name, half_day, 
-		status, employee
-		from `tabLeave Application` where
-		(from_date between %s and %s or to_date between %s and %s)
-		and docstatus < 2
-		and status!="Rejected"
-		and employee in ('%s')""" % ("%s", "%s", "%s", "%s", "', '".join(department_employees)), 
-			(start, end, start, end), as_dict=True):
-			events.append({
-				"id": d.name,
-				"employee": d.employee,
-				"doctype": "Leave Application",
-				"start": d.from_date,
-				"end": d.to_date,
-				"allDay": True,
-				"status": d.status,
-				"title": _("Leave by") + " " +  d.employee_name + \
-					(d.half_day and _(" (Half Day)") or "")
-			})
-	
-
-def add_block_dates(events, start, end, employee, company):
-	# block days
-	from hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates
-
-	cnt = 0
-	block_dates = get_applicable_block_dates(start, end, employee, company, all_lists=True)
-
-	for block_date in block_dates:
-		events.append({
-			"doctype": "Leave Block List Date",
-			"start": block_date.block_date,
-			"title": _("Leave Blocked") + ": " + block_date.reason,
-			"id": "_" + str(cnt),
-			"allDay": True
-		})
-		cnt+=1
-	
-
-@webnotes.whitelist()
-def update_event(name, start, end):
-	webnotes.conn.sql("""update tabEvent set starts_on=%s, ends_on=%s where 
-		name=%s""", (start, end, name))
-	
\ No newline at end of file
diff --git a/utilities/page/calendar/calendar.txt b/utilities/page/calendar/calendar.txt
deleted file mode 100644
index d8e30e4..0000000
--- a/utilities/page/calendar/calendar.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-[
- {
-  "owner": "Administrator", 
-  "docstatus": 0, 
-  "creation": "2012-02-24 11:24:12", 
-  "modified_by": "Administrator", 
-  "modified": "2012-02-24 11:24:12"
- }, 
- {
-  "name": "__common__", 
-  "title": "Calendar", 
-  "module": "Utilities", 
-  "doctype": "Page", 
-  "page_name": "calendar", 
-  "standard": "Yes"
- }, 
- {
-  "name": "calendar", 
-  "doctype": "Page"
- }
-]
\ No newline at end of file