diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 0000000000..da18d9352a --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} \ No newline at end of file diff --git a/cypress/integration/relative_filters.js b/cypress/integration/relative_filters.js new file mode 100644 index 0000000000..efc6b930b2 --- /dev/null +++ b/cypress/integration/relative_filters.js @@ -0,0 +1,50 @@ +context('Relative Timeframe', () => { + beforeEach(() => { + cy.login('Administrator', 'qwe'); + cy.visit('/desk'); + }); + before(() => { + cy.login('Administrator', 'qwe'); + cy.visit('/desk'); + cy.window().its('frappe').then(frappe => { + frappe.call("frappe.tests.test_utils.create_todo_records"); + }); + }); + it('set relative filter for Previous and check list', () => { + cy.visit('/desk#List/ToDo/List'); + cy.get('.list-row:contains("this is fourth todo")').should('exist'); + cy.get('.tag-filters-area .btn:contains("Add Filter")').click(); + cy.get('.fieldname-select-area').should('exist'); + cy.get('.fieldname-select-area input').type("Due Date{enter}", { delay: 100 }); + cy.get('select.condition.form-control').select("Previous"); + cy.get('.filter-field select.input-with-feedback.form-control').select("1 week"); + cy.server(); + cy.route({ + method: 'POST', + url: '/' + }).as('applyFilter'); + cy.get('.filter-box .btn:contains("Apply")').click(); + cy.wait('@applyFilter'); + cy.get('.list-row-container').its('length').should('eq', 1); + cy.get('.list-row-container').should('contain', 'this is second todo'); + cy.get('.remove-filter.btn').click(); + }); + it('set relative filter for Next and check list', () => { + cy.visit('/desk#List/ToDo/List'); + cy.get('.list-row:contains("this is fourth todo")').should('exist'); + cy.get('.tag-filters-area .btn:contains("Add Filter")').click(); + cy.get('.fieldname-select-area input').type("Due Date{enter}", { delay: 100 }); + cy.get('select.condition.form-control').select("Next"); + cy.get('.filter-field select.input-with-feedback.form-control').select("1 week"); + cy.server(); + cy.route({ + method: 'POST', + url: '/' + }).as('applyFilter'); + cy.get('.filter-box .btn:contains("Apply")').click(); + cy.wait('@applyFilter'); + cy.get('.list-row-container').its('length').should('eq', 1); + cy.get('.list-row').should('contain', 'this is first todo'); + cy.get('.remove-filter.btn').click(); + }); +}); diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index 224b6bc299..ab2ee4ced5 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -16,7 +16,7 @@ import frappe, json, copy, re from frappe.model import optional_fields from frappe.client import check_parent_permission from frappe.model.utils.user_settings import get_user_settings, update_user_settings -from frappe.utils import flt, cint, get_time, make_filter_tuple, get_filter, add_to_date, cstr +from frappe.utils import flt, cint, get_time, make_filter_tuple, get_filter, add_to_date, cstr, nowdate class DatabaseQuery(object): def __init__(self, doctype, user=None): @@ -402,6 +402,35 @@ class DatabaseQuery(object): if df and df.fieldtype in ("Check", "Float", "Int", "Currency", "Percent"): can_be_null = False + if f.operator.lower() in ('previous', 'next'): + if f.operator.lower() == "previous": + if f.value == "1 week": + date_range = [add_to_date(nowdate(), days=-7), nowdate()] + elif f.value == "1 month": + date_range = [add_to_date(nowdate(), months=-1), nowdate()] + elif f.value == "3 months": + date_range = [add_to_date(nowdate(), months=-3), nowdate()] + elif f.value == "6 months": + date_range = [add_to_date(nowdate(), months=-6), nowdate()] + elif f.value == "1 year": + date_range = [add_to_date(nowdate(), years=-1), nowdate()] + elif f.operator.lower() == "next": + if f.value == "1 week": + date_range = [nowdate(), add_to_date(nowdate(), days=7)] + elif f.value == "1 month": + date_range = [nowdate(), add_to_date(nowdate(), months=1)] + elif f.value == "3 months": + date_range = [nowdate(), add_to_date(nowdate(), months=3)] + elif f.value == "6 months": + date_range = [nowdate(), add_to_date(nowdate(), months=6)] + elif f.value == "1 year": + date_range = [nowdate(), add_to_date(nowdate(), years=1)] + if df.fieldtype=="Datetime": + date_range = [frappe.db.format_datetime(date_range[0]), frappe.db.format_datetime(date_range[1])] + f.operator = "Between" + f.value = date_range + fallback = "'0001-01-01 00:00:00'" + if f.operator in ('>', '<') and (f.fieldname in ('creation', 'modified')): value = cstr(f.value) fallback = "NULL" diff --git a/frappe/public/js/frappe/ui/filters/edit_filter.html b/frappe/public/js/frappe/ui/filters/edit_filter.html index 88f3a5b20c..d77fa7e625 100644 --- a/frappe/public/js/frappe/ui/filters/edit_filter.html +++ b/frappe/public/js/frappe/ui/filters/edit_filter.html @@ -18,6 +18,8 @@ + +