From f1c7f5966bfcda8b8d03a43e2b522cb3bb368254 Mon Sep 17 00:00:00 2001 From: Rushabh Mehta Date: Tue, 24 Feb 2015 14:28:34 +0530 Subject: [PATCH] [calendar] added filters, fixes in datetime --- frappe/__init__.py | 2 + frappe/model/db_query.py | 19 +++++-- frappe/public/build.json | 1 + frappe/public/js/frappe/form/control.js | 5 ++ frappe/public/js/frappe/views/calendar.js | 32 ++++++++++-- .../public/js/frappe/views/calendar_base.js | 50 +++++++++++++++++++ frappe/public/js/frappe/views/ganttview.js | 43 +--------------- frappe/utils/data.py | 32 ++++++------ 8 files changed, 119 insertions(+), 65 deletions(-) create mode 100644 frappe/public/js/frappe/views/calendar_base.js diff --git a/frappe/__init__.py b/frappe/__init__.py index accea72b58..aa9085f8ba 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -867,6 +867,8 @@ def get_all(doctype, *args, **kwargs): frappe.get_all("ToDo", fields=["*"], filters = {"description": ("like", "test%")}) """ kwargs["ignore_permissions"] = True + if not "limit_page_length" in kwargs: + kwargs["limit_page_length"] = 0 return get_list(doctype, *args, **kwargs) def add_version(doc): diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index b8111f36fb..597b559016 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -8,7 +8,7 @@ import frappe, json import frappe.defaults import frappe.share import frappe.permissions -from frappe.utils import flt, cint +from frappe.utils import flt, cint, getdate, get_datetime, get_time from frappe import _ class DatabaseQuery(object): @@ -217,9 +217,22 @@ class DatabaseQuery(object): tname=tname, fname=f[1], operator=f[2], value=f[3])) else: df = frappe.get_meta(f[0]).get("fields", {"fieldname": f[1]}) + df = df[0] if df else None - if f[2] == "like" or (isinstance(f[3], basestring) and - (not df or df[0].fieldtype not in ["Float", "Int", "Currency", "Percent", "Check"])): + if df and df.fieldtype=="Date": + value, default_val = '"{0}"'.format(frappe.db.escape(getdate(f[3]).strftime("%Y-%m-%d"))), \ + "'0000-00-00'" + + elif df and df.fieldtype=="Datetime": + value, default_val = '"{0}"'.format(frappe.db.escape(get_datetime(f[3]).strftime("%Y-%m-%d %H:%M:%S.%f"))), \ + "'0000-00-00 00:00:00'" + + elif df and df.fieldtype=="Time": + value, default_val = '"{0}"'.format(frappe.db.escape(get_time(f[3]).strftime("%H:%M:%S.%f"))), \ + "'00:00:00'" + + elif f[2] == "like" or (isinstance(f[3], basestring) and + (not df or df.fieldtype not in ["Float", "Int", "Currency", "Percent", "Check"])): if f[2] == "like": # because "like" uses backslash (\) for escaping f[3] = f[3].replace("\\", "\\\\") diff --git a/frappe/public/build.json b/frappe/public/build.json index b78eab29ad..0955a0d6ad 100644 --- a/frappe/public/build.json +++ b/frappe/public/build.json @@ -176,6 +176,7 @@ "public/js/frappe/list/list_item_row_head.html", "public/js/frappe/list/list_item_subject.html", "public/js/frappe/list/listview.js", + "public/js/frappe/views/calendar_base.js", "public/js/frappe/views/calendar.js", "public/js/frappe/views/ganttview.js" ], diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js index 5acf82706e..0d27ee8c40 100644 --- a/frappe/public/js/frappe/form/control.js +++ b/frappe/public/js/frappe/form/control.js @@ -246,6 +246,11 @@ frappe.ui.form.ControlInput = frappe.ui.form.Control.extend({ bind_change_event: function() { var me = this; this.$input && this.$input.on("change", this.change || function(e) { + if(me.df.change) { + // onchange event specified in df + me.df.change.apply(this, e); + return; + } if(me.doctype && me.docname && me.get_value) { me.parse_validate_and_set_in_model(me.get_value()); } else { diff --git a/frappe/public/js/frappe/views/calendar.js b/frappe/public/js/frappe/views/calendar.js index d244d6e8dd..6a7ecc1219 100644 --- a/frappe/public/js/frappe/views/calendar.js +++ b/frappe/public/js/frappe/views/calendar.js @@ -23,7 +23,7 @@ frappe.views.CalendarFactory = frappe.views.Factory.extend({ }); -frappe.views.Calendar = Class.extend({ +frappe.views.Calendar = frappe.views.CalendarBase.extend({ init: function(options) { $.extend(this, options); this.make_page(); @@ -31,7 +31,13 @@ frappe.views.Calendar = Class.extend({ this.make(); }, make_page: function() { + var me = this; this.parent = frappe.make_page(); + + $(this.parent).on("show", function() { + me.set_filters_from_route_options(); + }); + this.page = this.parent.page; var module = locals.DocType[this.doctype].module; this.page.set_title(__("Calendar") + " - " + __(this.doctype)); @@ -40,6 +46,17 @@ frappe.views.Calendar = Class.extend({ frappe.add_breadcrumbs(module, this.doctype) } + this.add_filters(); + + this.page.add_field({fieldtype:"Date", label:"Date", + fieldname:"selected", + "default": frappe.datetime.month_start(), + input_css: {"z-index": 1}, + change: function() { + me.$cal.fullCalendar("gotoDate", $(this).val()); + } + }); + this.page.set_primary_action(__("New"), function() { var doc = frappe.model.get_new_doc(me.doctype); frappe.set_route("Form", me.doctype, doc.name); @@ -50,6 +67,7 @@ frappe.views.Calendar = Class.extend({ me.$cal.fullCalendar("refetchEvents"); }) }, + make: function() { var me = this; this.$wrapper = this.page.main; @@ -61,7 +79,6 @@ frappe.views.Calendar = Class.extend({ // .appendTo(this.$wrapper); this.$cal.fullCalendar(this.cal_options); - this.set_css(); }, set_css: function() { @@ -179,11 +196,16 @@ frappe.views.Calendar = Class.extend({ } }, get_args: function(start, end) { - return { + var args = { doctype: this.doctype, start: frappe.datetime.get_datetime_as_string(start), - end: frappe.datetime.get_datetime_as_string(end) - } + end: frappe.datetime.get_datetime_as_string(end), + filters: this.get_filters() + }; + return args; + }, + refresh: function() { + this.$cal.fullCalendar('refetchEvents'); }, prepare_events: function(events) { var me = this; diff --git a/frappe/public/js/frappe/views/calendar_base.js b/frappe/public/js/frappe/views/calendar_base.js new file mode 100644 index 0000000000..3902eaf2ff --- /dev/null +++ b/frappe/public/js/frappe/views/calendar_base.js @@ -0,0 +1,50 @@ +// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +// MIT License. See license.txt + +frappe.views.CalendarBase = Class.extend({ + add_filters: function() { + var me = this; + if(this.filters) { + $.each(this.filters, function(i, df) { + df.change = function() { + me.refresh(); + }; + me.page.add_field(df); + }); + } + }, + set_filter: function(doctype, value) { + var me = this; + if(this.filters) { + $.each(this.filters, function(i, df) { + if(df.options===value) + me.page.fields_dict[df.fieldname].set_input(value); + return false; + }); + } + }, + get_filters: function() { + var filter_vals = {}, + me = this; + if(this.filters) { + $.each(this.filters, function(i, df) { + filter_vals[df.fieldname || df.label] = + me.page.fields_dict[df.fieldname || df.label].get_parsed_value(); + }); + } + return filter_vals; + }, + set_filters_from_route_options: function() { + var me = this; + if(frappe.route_options) { + $.each(frappe.route_options, function(k, value) { + if(me.page.fields_dict[k]) { + me.page.fields_dict[k].set_input(value); + }; + }) + frappe.route_options = null; + me.refresh(); + return false; + } + } +}) diff --git a/frappe/public/js/frappe/views/ganttview.js b/frappe/public/js/frappe/views/ganttview.js index 163f7f0d67..2446aa35b1 100644 --- a/frappe/public/js/frappe/views/ganttview.js +++ b/frappe/public/js/frappe/views/ganttview.js @@ -27,7 +27,7 @@ frappe.views.GanttFactory = frappe.views.Factory.extend({ } }); -frappe.views.Gantt = Class.extend({ +frappe.views.Gantt = frappe.views.CalendarBase.extend({ init: function(opts) { $.extend(this, opts); this.make_page(); @@ -52,12 +52,7 @@ frappe.views.Gantt = Class.extend({ this.page.add_field({fieldtype:"Date", label:"To", fieldname:"end", "default": frappe.datetime.month_end(), input_css: {"z-index": 3}}); - if(this.filters) { - $.each(this.filters, function(i, df) { - me.page.add_field(df); - }); - } - + this.add_filters(); this.wrapper = $("
").appendTo(this.page.main); }, @@ -97,27 +92,6 @@ frappe.views.Gantt = Class.extend({ }) }, - set_filter: function(doctype, value) { - var me = this; - if(this.filters) { - $.each(this.filters, function(i, df) { - if(df.options===value) - me.page.fields_dict[df.fieldname].set_input(value); - return false; - }); - } - }, - get_filters: function() { - var filter_vals = {}, - me = this; - if(this.filters) { - $.each(this.filters, function(i, df) { - filter_vals[df.fieldname || df.label] = - me.page.fields_dict[df.fieldname || df.label].get_parsed_value(); - }); - } - return filter_vals; - }, get_source: function(r) { var source = [], me = this; @@ -158,18 +132,5 @@ frappe.views.Gantt = Class.extend({ } }); return source - }, - set_filters_from_route_options: function() { - var me = this; - if(frappe.route_options) { - $.each(frappe.route_options, function(k, value) { - if(me.page.fields_dict[k]) { - me.page.fields_dict[k].set_input(value); - }; - }) - frappe.route_options = null; - me.refresh(); - return false; - } } }); diff --git a/frappe/utils/data.py b/frappe/utils/data.py index d382673e55..b4a7e5f103 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -28,6 +28,22 @@ def getdate(string_date): return datetime.datetime.strptime(string_date, "%Y-%m-%d").date() +def get_datetime(datetime_str): + if isinstance(datetime_str, datetime.datetime): + return datetime_str + + elif isinstance(datetime_str, datetime.date): + return datetime.datetime.combine(datetime_str, datetime.time()) + + try: + return datetime.datetime.strptime(datetime_str, DATETIME_FORMAT) + + except ValueError: + if datetime_str=='0000-00-00 00:00:00.000000': + return None + + return datetime.datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S') + def add_to_date(date, years=0, months=0, days=0): """Adds `days` to the given date""" @@ -134,22 +150,6 @@ def get_last_day(dt): """ return get_first_day(dt, 0, 1) + datetime.timedelta(-1) -def get_datetime(datetime_str): - try: - return datetime.datetime.strptime(datetime_str, DATETIME_FORMAT) - - except TypeError: - if isinstance(datetime_str, datetime.datetime): - return datetime_str.replace(tzinfo=None) - else: - raise - - except ValueError: - if datetime_str=='0000-00-00 00:00:00.000000': - return None - - return datetime.datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S') - def get_time(time_str): if isinstance(time_str, datetime.datetime):