You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 11 години
преди 13 години
преди 14 години
преди 12 години
преди 12 години
преди 11 години
преди 14 години
преди 14 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 13 години
преди 13 години
преди 13 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  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, (tuple, 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 filter(None, 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 i, d in enumerate(self):
  95. if d.get("parent") and d.get("name") not in [t.get("name") for t in doclist]:
  96. del self[i]
  97. for d in doclist:
  98. if not d["name"]:
  99. d["__islocal"] = 1
  100. self.append(d)
  101. else:
  102. # child
  103. found_in_existing = False
  104. for ref in self:
  105. if d["name"] and ref.name and ref.name == d["name"]:
  106. ref.fields.update(d)
  107. found_in_existing = True
  108. break
  109. if not found_in_existing:
  110. d["__islocal"] = 1
  111. d["name"] = None
  112. self.append(d)
  113. return self
  114. def objectify(doclist):
  115. from webnotes.model.doc import Document
  116. return map(lambda d: isinstance(d, Document) and d or Document(d), doclist)