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