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.

пре 13 година
пре 14 година
пре 12 година
пре 12 година
пре 14 година
пре 14 година
пре 12 година
пре 12 година
пре 13 година
пре 13 година
пре 13 година
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. class DocList(list):
  7. """DocList object as a wrapper around a list"""
  8. def get(self, filters, limit=0):
  9. """pass filters as:
  10. {"key": "val", "key": ["!=", "val"],
  11. "key": ["in", "val"], "key": ["not in", "val"], "key": "^val",
  12. "key" : True (exists), "key": False (does not exist) }"""
  13. out = []
  14. for doc in self:
  15. d = isinstance(getattr(doc, "fields", None), dict) and doc.fields or doc
  16. add = True
  17. for f in filters:
  18. fval = filters[f]
  19. if fval is True:
  20. fval = ["not None", fval]
  21. elif fval is False:
  22. fval = ["None", fval]
  23. elif not isinstance(fval, list):
  24. if isinstance(fval, basestring) and fval.startswith("^"):
  25. fval = ["^", fval[1:]]
  26. else:
  27. fval = ["=", fval]
  28. if not webnotes.compare(d.get(f), fval[0], fval[1]):
  29. add = False
  30. break
  31. if add:
  32. out.append(doc)
  33. if limit and (len(out)-1)==limit:
  34. break
  35. return DocList(out)
  36. def get_distinct_values(self, fieldname):
  37. return list(set(map(lambda d: d.fields.get(fieldname), self)))
  38. def remove_items(self, filters):
  39. for d in self.get(filters):
  40. self.remove(d)
  41. def getone(self, filters):
  42. return self.get(filters, limit=1)[0]
  43. def copy(self):
  44. out = []
  45. for d in self:
  46. if isinstance(d, dict):
  47. fielddata = d
  48. else:
  49. fielddata = d.fields
  50. fielddata.update({"name": None})
  51. out.append(Document(fielddata=fielddata))
  52. return DocList(out)
  53. def get_item_value(self, d, name):
  54. if isinstance(d, dict):
  55. return d.get(name)
  56. else:
  57. return d.fields.get(name)
  58. def filter_valid_fields(self):
  59. import webnotes.model
  60. fieldnames = {}
  61. for d in self:
  62. remove = []
  63. for f in d:
  64. if f not in fieldnames.setdefault(d.doctype,
  65. webnotes.model.get_fieldnames(d.doctype)):
  66. remove.append(f)
  67. for f in remove:
  68. del d[f]
  69. def append(self, doc):
  70. if not isinstance(doc, Document):
  71. doc = Document(fielddata=doc)
  72. self._prepare_doc(doc)
  73. super(DocList, self).append(doc)
  74. def extend(self, doclist):
  75. doclist = objectify(doclist)
  76. for doc in doclist:
  77. self._prepare_doc(doc)
  78. super(DocList, self).extend(doclist)
  79. return self
  80. def _prepare_doc(self, doc):
  81. if not doc.name:
  82. doc.fields["__islocal"] = 1
  83. doc.docstatus = 0
  84. if doc.parentfield:
  85. if not doc.parenttype:
  86. doc.parenttype = self[0].doctype
  87. if not doc.parent:
  88. doc.parent = self[0].name
  89. if not doc.idx:
  90. siblings = [int(self.get_item_value(d, "idx") or 0) for d in self.get({"parentfield": doc.parentfield})]
  91. doc.idx = (max(siblings) + 1) if siblings else 1
  92. def objectify(doclist):
  93. from webnotes.model.doc import Document
  94. return map(lambda d: isinstance(d, Document) and d or Document(d), doclist)