No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

116 líneas
2.8 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. 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[name]
  56. else:
  57. return d.fields[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. if doc.parentfield:
  84. if not doc.parenttype:
  85. doc.parenttype = self[0].doctype
  86. if not doc.parent:
  87. doc.parent = self[0].name
  88. if not doc.idx:
  89. siblings = [int(self.get_item_value(d, "idx") or 0) for d in self.get({"parentfield": doc.parentfield})]
  90. doc.idx = (max(siblings) + 1) if siblings else 1
  91. def objectify(doclist):
  92. from webnotes.model.doc import Document
  93. return map(lambda d: isinstance(d, Document) and d or Document(d), doclist)