Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

doclist.py 3.4 KiB

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)