瀏覽代碼

[calendar] added filters, fixes in datetime

version-14
Rushabh Mehta 10 年之前
父節點
當前提交
f1c7f5966b
共有 8 個檔案被更改,包括 119 行新增65 行删除
  1. +2
    -0
      frappe/__init__.py
  2. +16
    -3
      frappe/model/db_query.py
  3. +1
    -0
      frappe/public/build.json
  4. +5
    -0
      frappe/public/js/frappe/form/control.js
  5. +27
    -5
      frappe/public/js/frappe/views/calendar.js
  6. +50
    -0
      frappe/public/js/frappe/views/calendar_base.js
  7. +2
    -41
      frappe/public/js/frappe/views/ganttview.js
  8. +16
    -16
      frappe/utils/data.py

+ 2
- 0
frappe/__init__.py 查看文件

@@ -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):


+ 16
- 3
frappe/model/db_query.py 查看文件

@@ -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("\\", "\\\\")


+ 1
- 0
frappe/public/build.json 查看文件

@@ -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"
], ],


+ 5
- 0
frappe/public/js/frappe/form/control.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 {


+ 27
- 5
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) { 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;


+ 50
- 0
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;
}
}
})

+ 2
- 41
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) { 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;
}
} }
}); });

+ 16
- 16
frappe/utils/data.py 查看文件

@@ -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):


Loading…
取消
儲存