@@ -867,6 +867,8 @@ def get_all(doctype, *args, **kwargs): | |||||
frappe.get_all("ToDo", fields=["*"], filters = {"description": ("like", "test%")}) | frappe.get_all("ToDo", fields=["*"], filters = {"description": ("like", "test%")}) | ||||
""" | """ | ||||
kwargs["ignore_permissions"] = True | kwargs["ignore_permissions"] = True | ||||
if not "limit_page_length" in kwargs: | |||||
kwargs["limit_page_length"] = 0 | |||||
return get_list(doctype, *args, **kwargs) | return get_list(doctype, *args, **kwargs) | ||||
def add_version(doc): | def add_version(doc): | ||||
@@ -8,7 +8,7 @@ import frappe, json | |||||
import frappe.defaults | import frappe.defaults | ||||
import frappe.share | import frappe.share | ||||
import frappe.permissions | import frappe.permissions | ||||
from frappe.utils import flt, cint | |||||
from frappe.utils import flt, cint, getdate, get_datetime, get_time | |||||
from frappe import _ | from frappe import _ | ||||
class DatabaseQuery(object): | class DatabaseQuery(object): | ||||
@@ -217,9 +217,22 @@ class DatabaseQuery(object): | |||||
tname=tname, fname=f[1], operator=f[2], value=f[3])) | tname=tname, fname=f[1], operator=f[2], value=f[3])) | ||||
else: | else: | ||||
df = frappe.get_meta(f[0]).get("fields", {"fieldname": f[1]}) | 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": | if f[2] == "like": | ||||
# because "like" uses backslash (\) for escaping | # because "like" uses backslash (\) for escaping | ||||
f[3] = f[3].replace("\\", "\\\\") | f[3] = f[3].replace("\\", "\\\\") | ||||
@@ -176,6 +176,7 @@ | |||||
"public/js/frappe/list/list_item_row_head.html", | "public/js/frappe/list/list_item_row_head.html", | ||||
"public/js/frappe/list/list_item_subject.html", | "public/js/frappe/list/list_item_subject.html", | ||||
"public/js/frappe/list/listview.js", | "public/js/frappe/list/listview.js", | ||||
"public/js/frappe/views/calendar_base.js", | |||||
"public/js/frappe/views/calendar.js", | "public/js/frappe/views/calendar.js", | ||||
"public/js/frappe/views/ganttview.js" | "public/js/frappe/views/ganttview.js" | ||||
], | ], | ||||
@@ -246,6 +246,11 @@ frappe.ui.form.ControlInput = frappe.ui.form.Control.extend({ | |||||
bind_change_event: function() { | bind_change_event: function() { | ||||
var me = this; | var me = this; | ||||
this.$input && this.$input.on("change", this.change || function(e) { | 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) { | if(me.doctype && me.docname && me.get_value) { | ||||
me.parse_validate_and_set_in_model(me.get_value()); | me.parse_validate_and_set_in_model(me.get_value()); | ||||
} else { | } else { | ||||
@@ -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) { | init: function(options) { | ||||
$.extend(this, options); | $.extend(this, options); | ||||
this.make_page(); | this.make_page(); | ||||
@@ -31,7 +31,13 @@ frappe.views.Calendar = Class.extend({ | |||||
this.make(); | this.make(); | ||||
}, | }, | ||||
make_page: function() { | make_page: function() { | ||||
var me = this; | |||||
this.parent = frappe.make_page(); | this.parent = frappe.make_page(); | ||||
$(this.parent).on("show", function() { | |||||
me.set_filters_from_route_options(); | |||||
}); | |||||
this.page = this.parent.page; | this.page = this.parent.page; | ||||
var module = locals.DocType[this.doctype].module; | var module = locals.DocType[this.doctype].module; | ||||
this.page.set_title(__("Calendar") + " - " + __(this.doctype)); | this.page.set_title(__("Calendar") + " - " + __(this.doctype)); | ||||
@@ -40,6 +46,17 @@ frappe.views.Calendar = Class.extend({ | |||||
frappe.add_breadcrumbs(module, this.doctype) | 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() { | this.page.set_primary_action(__("New"), function() { | ||||
var doc = frappe.model.get_new_doc(me.doctype); | var doc = frappe.model.get_new_doc(me.doctype); | ||||
frappe.set_route("Form", me.doctype, doc.name); | frappe.set_route("Form", me.doctype, doc.name); | ||||
@@ -50,6 +67,7 @@ frappe.views.Calendar = Class.extend({ | |||||
me.$cal.fullCalendar("refetchEvents"); | me.$cal.fullCalendar("refetchEvents"); | ||||
}) | }) | ||||
}, | }, | ||||
make: function() { | make: function() { | ||||
var me = this; | var me = this; | ||||
this.$wrapper = this.page.main; | this.$wrapper = this.page.main; | ||||
@@ -61,7 +79,6 @@ frappe.views.Calendar = Class.extend({ | |||||
// .appendTo(this.$wrapper); | // .appendTo(this.$wrapper); | ||||
this.$cal.fullCalendar(this.cal_options); | this.$cal.fullCalendar(this.cal_options); | ||||
this.set_css(); | this.set_css(); | ||||
}, | }, | ||||
set_css: function() { | set_css: function() { | ||||
@@ -179,11 +196,16 @@ frappe.views.Calendar = Class.extend({ | |||||
} | } | ||||
}, | }, | ||||
get_args: function(start, end) { | get_args: function(start, end) { | ||||
return { | |||||
var args = { | |||||
doctype: this.doctype, | doctype: this.doctype, | ||||
start: frappe.datetime.get_datetime_as_string(start), | 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) { | prepare_events: function(events) { | ||||
var me = this; | var me = this; | ||||
@@ -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; | |||||
} | |||||
} | |||||
}) |
@@ -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) { | init: function(opts) { | ||||
$.extend(this, opts); | $.extend(this, opts); | ||||
this.make_page(); | this.make_page(); | ||||
@@ -52,12 +52,7 @@ frappe.views.Gantt = Class.extend({ | |||||
this.page.add_field({fieldtype:"Date", label:"To", | this.page.add_field({fieldtype:"Date", label:"To", | ||||
fieldname:"end", "default": frappe.datetime.month_end(), input_css: {"z-index": 3}}); | 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 = $("<div></div>").appendTo(this.page.main); | this.wrapper = $("<div></div>").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) { | get_source: function(r) { | ||||
var source = [], | var source = [], | ||||
me = this; | me = this; | ||||
@@ -158,18 +132,5 @@ frappe.views.Gantt = Class.extend({ | |||||
} | } | ||||
}); | }); | ||||
return source | 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; | |||||
} | |||||
} | } | ||||
}); | }); |
@@ -28,6 +28,22 @@ def getdate(string_date): | |||||
return datetime.datetime.strptime(string_date, "%Y-%m-%d").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): | def add_to_date(date, years=0, months=0, days=0): | ||||
"""Adds `days` to the given date""" | """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) | 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): | def get_time(time_str): | ||||
if isinstance(time_str, datetime.datetime): | if isinstance(time_str, datetime.datetime): | ||||