From 9249f354cd5ede82b53c09ed4b781087fc51c707 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Fri, 15 Feb 2013 19:28:05 +0530 Subject: [PATCH 1/2] added view selector and calendar view for leave application --- home/page/latest_updates/latest_updates.js | 4 ++ .../leave_application/leave_application.py | 58 ++++++++++++++++++- .../leave_application_calendar.js | 10 ++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 hr/doctype/leave_application/leave_application_calendar.js diff --git a/home/page/latest_updates/latest_updates.js b/home/page/latest_updates/latest_updates.js index a3f37607b9..42408de3b7 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 17f8526f2d..1fae2409b5 100755 --- a/hr/doctype/leave_application/leave_application.py +++ b/hr/doctype/leave_application/leave_application.py @@ -152,4 +152,60 @@ def get_approver_list(): 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 0000000000..eebd5590a5 --- /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 From bf4ef36341bf5693a11e29af31ba671c0a445bd2 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Sat, 16 Feb 2013 10:44:51 +0530 Subject: [PATCH 2/2] removed calendar and fix --- patches/patch_list.py | 3 +- utilities/page/calendar/__init__.py | 1 - utilities/page/calendar/calendar.js | 160 --------------------------- utilities/page/calendar/calendar.py | 85 -------------- utilities/page/calendar/calendar.txt | 21 ---- 5 files changed, 2 insertions(+), 268 deletions(-) delete mode 100644 utilities/page/calendar/__init__.py delete mode 100644 utilities/page/calendar/calendar.js delete mode 100644 utilities/page/calendar/calendar.py delete mode 100644 utilities/page/calendar/calendar.txt diff --git a/patches/patch_list.py b/patches/patch_list.py index 1a7483975c..be87d44f51 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -169,5 +169,6 @@ patch_list = [ "patches.february_2013.update_company_in_leave_application", "execute:webnotes.conn.sql_ddl('alter table tabSeries change `name` `name` varchar(100)')", "execute:webnotes.conn.sql('update tabUserRole set parentfield=\"user_roles\" where parentfield=\"userroles\"')", - "patches.february_2013.fix_outstanding" + "patches.february_2013.fix_outstanding", + "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 baffc48825..0000000000 --- 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 033e906b1f..0000000000 --- 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() { - $('
').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 06d4385569..0000000000 --- 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 d8e30e4985..0000000000 --- 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