您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

141 行
3.3 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
  2. # MIT License. See license.txt
  3. import webnotes
  4. import webnotes.model
  5. from webnotes.model.doc import Document
  6. from webnotes import _
  7. class DocList(list):
  8. """DocList object as a wrapper around a list"""
  9. def get(self, filters, limit=0):
  10. """pass filters as:
  11. {"key": "val", "key": ["!=", "val"],
  12. "key": ["in", "val"], "key": ["not in", "val"], "key": "^val",
  13. "key" : True (exists), "key": False (does not exist) }"""
  14. out = []
  15. for doc in self:
  16. d = isinstance(getattr(doc, "fields", None), dict) and doc.fields or doc
  17. add = True
  18. for f in filters:
  19. fval = filters[f]
  20. if fval is True:
  21. fval = ["not None", fval]
  22. elif fval is False:
  23. fval = ["None", fval]
  24. elif not isinstance(fval, list):
  25. if isinstance(fval, basestring) and fval.startswith("^"):
  26. fval = ["^", fval[1:]]
  27. else:
  28. fval = ["=", fval]
  29. if not webnotes.compare(d.get(f), fval[0], fval[1]):
  30. add = False
  31. break
  32. if add:
  33. out.append(doc)
  34. if limit and (len(out)-1)==limit:
  35. break
  36. return DocList(out)
  37. def get_distinct_values(self, fieldname):
  38. return list(set(map(lambda d: d.fields.get(fieldname), self)))
  39. def remove_items(self, filters):
  40. for d in self.get(filters):
  41. self.remove(d)
  42. def getone(self, filters):
  43. return self.get(filters, limit=1)[0]
  44. def copy(self):
  45. out = []
  46. for d in self:
  47. if isinstance(d, dict):
  48. fielddata = d
  49. else:
  50. fielddata = d.fields
  51. fielddata.update({"name": None})
  52. out.append(Document(fielddata=fielddata))
  53. return DocList(out)
  54. def get_item_value(self, d, name):
  55. if isinstance(d, dict):
  56. return d.get(name)
  57. else:
  58. return d.fields.get(name)
  59. def filter_valid_fields(self):
  60. import webnotes.model
  61. fieldnames = {}
  62. for d in self:
  63. remove = []
  64. for f in d:
  65. if f not in fieldnames.setdefault(d.doctype,
  66. webnotes.model.get_fieldnames(d.doctype)):
  67. remove.append(f)
  68. for f in remove:
  69. del d[f]
  70. def append(self, doc):
  71. if not isinstance(doc, Document):
  72. doc = Document(fielddata=doc)
  73. self._prepare_doc(doc)
  74. super(DocList, self).append(doc)
  75. def extend(self, doclist):
  76. doclist = objectify(doclist)
  77. for doc in doclist:
  78. self._prepare_doc(doc)
  79. super(DocList, self).extend(doclist)
  80. return self
  81. def _prepare_doc(self, doc):
  82. if not doc.name:
  83. doc.fields["__islocal"] = 1
  84. doc.docstatus = 0
  85. if doc.parentfield:
  86. if not doc.parenttype:
  87. doc.parenttype = self[0].doctype
  88. if not doc.parent:
  89. doc.parent = self[0].name
  90. if not doc.idx:
  91. siblings = [int(self.get_item_value(d, "idx") or 0) for d in self.get({"parentfield": doc.parentfield})]
  92. doc.idx = (max(siblings) + 1) if siblings else 1
  93. def update(self, doclist):
  94. for d in doclist:
  95. if not d["name"]:
  96. d["__islocal"] = 1
  97. self.append(d)
  98. else:
  99. matched = False
  100. for ref in self:
  101. if isinstance(ref, dict):
  102. fielddata = ref
  103. else:
  104. fielddata = ref.fields
  105. if d["name"] and ref.name and ref.name == d["name"]:
  106. ref.fields.update(d)
  107. matched = True
  108. break
  109. if not matched:
  110. webnotes.throw("[" + d["doctype"] + "] ID: " + d["name"] +
  111. _(" does not exists"))
  112. return self
  113. def objectify(doclist):
  114. from webnotes.model.doc import Document
  115. return map(lambda d: isinstance(d, Document) and d or Document(d), doclist)