Esempio n. 1
0
	def test_data_import_from_file(self):
		import_file = get_import_file('sample_import_file')
		data_import = self.get_importer(doctype_name, import_file)
		data_import.start_import()

		doc1 = frappe.get_doc(doctype_name, 'Test')
		doc2 = frappe.get_doc(doctype_name, 'Test 2')
		doc3 = frappe.get_doc(doctype_name, 'Test 3')

		self.assertEqual(doc1.description, 'test description')
		self.assertEqual(doc1.number, 1)
		self.assertEqual(format_duration(doc1.duration), '3h')

		self.assertEqual(doc1.table_field_1[0].child_title, 'child title')
		self.assertEqual(doc1.table_field_1[0].child_description, 'child description')

		self.assertEqual(doc1.table_field_1[1].child_title, 'child title 2')
		self.assertEqual(doc1.table_field_1[1].child_description, 'child description 2')

		self.assertEqual(doc1.table_field_2[1].child_2_title, 'title child')
		self.assertEqual(doc1.table_field_2[1].child_2_date, getdate('2019-10-30'))
		self.assertEqual(doc1.table_field_2[1].child_2_another_number, 5)

		self.assertEqual(doc1.table_field_1_again[0].child_title, 'child title again')
		self.assertEqual(doc1.table_field_1_again[1].child_title, 'child title again 2')
		self.assertEqual(doc1.table_field_1_again[1].child_date, getdate('2021-09-22'))

		self.assertEqual(doc2.description, 'test description 2')
		self.assertEqual(format_duration(doc2.duration), '4d 3h')

		self.assertEqual(doc3.another_number, 5)
		self.assertEqual(format_duration(doc3.duration), '5d 5h 45m')
Esempio n. 2
0
def handle_duration_fieldtype_values(result, columns):
    for i, col in enumerate(columns):
        fieldtype = None
        if isinstance(col, string_types):
            col = col.split(":")
            if len(col) > 1:
                if col[1]:
                    fieldtype = col[1]
                    if "/" in fieldtype:
                        fieldtype, options = fieldtype.split("/")
                else:
                    fieldtype = "Data"
        else:
            fieldtype = col.get("fieldtype")

        if fieldtype == "Duration":
            for entry in range(0, len(result)):
                row = result[entry]
                if isinstance(row, dict):
                    val_in_seconds = row[col.fieldname]
                    if val_in_seconds:
                        duration_val = format_duration(val_in_seconds)
                        row[col.fieldname] = duration_val
                else:
                    val_in_seconds = row[i]
                    if val_in_seconds:
                        duration_val = format_duration(val_in_seconds)
                        row[i] = duration_val

    return result
Esempio n. 3
0
    def add_data_row(self, rows, dt, parentfield, doc, rowidx):
        d = doc.copy()
        meta = frappe.get_meta(dt)
        if self.all_doctypes:
            d.name = '"' + d.name + '"'

        if len(rows) < rowidx + 1:
            rows.append([""] * (len(self.columns) + 1))
        row = rows[rowidx]

        _column_start_end = self.column_start_end.get((dt, parentfield))

        if _column_start_end:
            for i, c in enumerate(self.columns[_column_start_end.
                                               start:_column_start_end.end]):
                df = meta.get_field(c)
                fieldtype = df.fieldtype if df else "Data"
                value = d.get(c, "")
                if value:
                    if fieldtype == "Date":
                        value = formatdate(value)
                    elif fieldtype == "Datetime":
                        value = format_datetime(value)
                    elif fieldtype == "Duration":
                        value = format_duration(value, df.hide_days)

                row[_column_start_end.start + i + 1] = value
Esempio n. 4
0
def handle_duration_fieldtype_values(doctype, data, fields):
    for field in fields:
        key = field.split(" as ")[0]

        if key.startswith(("count(", "sum(", "avg(")):
            continue

        if "." in key:
            parenttype, fieldname = key.split(".")[0][4:-1], key.split(
                ".")[1].strip("`")
        else:
            parenttype = doctype
            fieldname = field.strip("`")

        df = frappe.get_meta(parenttype).get_field(fieldname)

        if df and df.fieldtype == "Duration":
            index = fields.index(field) + 1
            for i in range(1, len(data)):
                val_in_seconds = data[i][index]
                if val_in_seconds:
                    duration_val = format_duration(val_in_seconds,
                                                   df.hide_days)
                    data[i][index] = duration_val
    return data
Esempio n. 5
0
    def test_data_import_from_file(self):
        import_file = get_import_file("sample_import_file")
        data_import = self.get_importer(doctype_name, import_file)
        data_import.start_import()

        doc1 = frappe.get_doc(doctype_name, "Test")
        doc2 = frappe.get_doc(doctype_name, "Test 2")
        doc3 = frappe.get_doc(doctype_name, "Test 3")

        self.assertEqual(doc1.description, "test description")
        self.assertEqual(doc1.number, 1)
        self.assertEqual(format_duration(doc1.duration), "3h")

        self.assertEqual(doc1.table_field_1[0].child_title, "child title")
        self.assertEqual(doc1.table_field_1[0].child_description,
                         "child description")

        self.assertEqual(doc1.table_field_1[1].child_title, "child title 2")
        self.assertEqual(doc1.table_field_1[1].child_description,
                         "child description 2")

        self.assertEqual(doc1.table_field_2[1].child_2_title, "title child")
        self.assertEqual(doc1.table_field_2[1].child_2_date,
                         getdate("2019-10-30"))
        self.assertEqual(doc1.table_field_2[1].child_2_another_number, 5)

        self.assertEqual(doc1.table_field_1_again[0].child_title,
                         "child title again")
        self.assertEqual(doc1.table_field_1_again[1].child_title,
                         "child title again 2")
        self.assertEqual(doc1.table_field_1_again[1].child_date,
                         getdate("2021-09-22"))

        self.assertEqual(doc2.description, "test description 2")
        self.assertEqual(format_duration(doc2.duration), "4d 3h")

        self.assertEqual(doc3.another_number, 5)
        self.assertEqual(format_duration(doc3.duration), "5d 5h 45m")
Esempio n. 6
0
    def add_data_row(self, doctype, parentfield, doc, rows, row_idx):
        if len(rows) < row_idx + 1:
            rows.append([""] * len(self.fields))

        row = rows[row_idx]

        for i, df in enumerate(self.fields):
            if df.parent == doctype:
                if df.is_child_table_field and df.child_table_df.fieldname != parentfield:
                    continue
                value = doc.get(df.fieldname, None)

                if df.fieldtype == "Duration":
                    value = flt(value or 0)
                    value = format_duration(value, df.hide_days)

                row[i] = value
        return rows
Esempio n. 7
0
def format_value(value,
                 df=None,
                 doc=None,
                 currency=None,
                 translated=False,
                 format=None):
    '''Format value based on given fieldtype, document reference, currency reference.
	If docfield info (df) is not given, it will try and guess based on the datatype of the value'''
    if isinstance(df, str):
        df = frappe._dict(fieldtype=df)

    if not df:
        df = frappe._dict()
        if isinstance(value, datetime.datetime):
            df.fieldtype = 'Datetime'
        elif isinstance(value, datetime.date):
            df.fieldtype = 'Date'
        elif isinstance(value, datetime.timedelta):
            df.fieldtype = 'Time'
        elif isinstance(value, int):
            df.fieldtype = 'Int'
        elif isinstance(value, float):
            df.fieldtype = 'Float'
        else:
            df.fieldtype = 'Data'

    elif (isinstance(df, dict)):
        # Convert dict to object if necessary
        df = frappe._dict(df)

    if value is None:
        value = ""
    elif translated:
        value = frappe._(value)

    if not df:
        return value

    elif df.get("fieldtype") == "Date":
        return formatdate(value)

    elif df.get("fieldtype") == "Datetime":
        return format_datetime(value)

    elif df.get("fieldtype") == "Time":
        return format_time(value)

    elif value == 0 and df.get("fieldtype") in (
            "Int", "Float", "Currency",
            "Percent") and df.get("print_hide_if_no_value"):
        # this is required to show 0 as blank in table columns
        return ""

    elif df.get("fieldtype") == "Currency":
        default_currency = frappe.db.get_default("currency")
        currency = currency or get_field_currency(df, doc) or default_currency
        return fmt_money(value,
                         precision=get_field_precision(df, doc),
                         currency=currency,
                         format=format)

    elif df.get("fieldtype") == "Float":
        precision = get_field_precision(df, doc)
        # I don't know why we support currency option for float
        currency = currency or get_field_currency(df, doc)

        # show 1.000000 as 1
        # options should not specified
        if not df.options and value is not None:
            temp = cstr(value).split(".")
            if len(temp) == 1 or cint(temp[1]) == 0:
                precision = 0

        return fmt_money(value, precision=precision, currency=currency)

    elif df.get("fieldtype") == "Percent":
        return "{}%".format(flt(value, 2))

    elif df.get("fieldtype") in ("Text", "Small Text"):
        if not re.search(r"(<br|<div|<p)", value):
            return frappe.safe_decode(value).replace("\n", "<br>")

    elif df.get("fieldtype") == "Markdown Editor":
        return frappe.utils.markdown(value)

    elif df.get("fieldtype") == "Table MultiSelect":
        meta = frappe.get_meta(df.options)
        link_field = [df for df in meta.fields if df.fieldtype == 'Link'][0]
        values = [v.get(link_field.fieldname, 'asdf') for v in value]
        return ', '.join(values)

    elif df.get("fieldtype") == "Duration":
        hide_days = df.hide_days
        return format_duration(value, hide_days)

    elif df.get("fieldtype") == "Text Editor":
        return "<div class='ql-snow'>{}</div>".format(value)

    return value