/src/baruwa/reports/utils.py

https://bitbucket.org/datopdog/baruwa · Python · 290 lines · 231 code · 39 blank · 20 comment · 63 complexity · b251635e6cd1b8dbb733c7330070ccaf MD5 · raw file

  1. #
  2. # Baruwa - Web 2.0 MailScanner front-end.
  3. # Copyright (C) 2010-2011 Andrew Colin Kissa <andrew@topdog.za.net>
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License along
  16. # with this program; if not, write to the Free Software Foundation, Inc.,
  17. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  18. #
  19. # vim: ai ts=4 sts=4 et sw=4
  20. #
  21. from django.db.models import Count, Sum, Q
  22. from baruwa.messages.models import Message
  23. from baruwa.utils.misc import apply_filter
  24. from baruwa.utils.graphs import PIE_COLORS
  25. def pack_json_data(data, arg1, arg2):
  26. "creates the json for the svn pie charts"
  27. ret = []
  28. for index, item in enumerate(data):
  29. pie_data = {}
  30. pie_data['y'] = item[arg2]
  31. pie_data['color'] = PIE_COLORS[index]
  32. pie_data['stroke'] = 'black'
  33. pie_data['tooltip'] = item[arg1]
  34. ret.append(pie_data)
  35. return ret
  36. def run_hosts_query(request, active_filters):
  37. "run the top hosts query"
  38. data = Message.messages.for_user(request).values('clientip').exclude(
  39. Q(clientip__exact = '') | Q(clientip__exact = '127.0.0.1') |
  40. Q(clientip__isnull=True)).annotate(num_count=Count('clientip'),
  41. total_size=Sum('size'), virus_total=Sum('virusinfected'),
  42. spam_total=Sum('spam')).order_by('-num_count')
  43. data = apply_filter(data, request, active_filters)
  44. data = data[:10]
  45. return data
  46. def run_query(query_field, exclude_kwargs, order_by, request, active_filters):
  47. "run a query"
  48. data = Message.messages.for_user(request).values(query_field).exclude(
  49. **exclude_kwargs).annotate(num_count=Count(query_field),
  50. total_size=Sum('size')).order_by(order_by)
  51. data = apply_filter(data, request, active_filters)
  52. data = data[:10]
  53. return data
  54. def gen_dynamic_raw_query(filter_list):
  55. "generates a dynamic query"
  56. sql = []
  57. asql = []
  58. avals = []
  59. osql = []
  60. ovals = []
  61. nosql = []
  62. novals = []
  63. for filter_item in filter_list:
  64. if filter_item['filter'] == 1:
  65. tmp = "%s = %%s" % filter_item['field']
  66. if tmp in asql:
  67. inx = asql.index(tmp)
  68. tvl = avals[inx]
  69. osql.append(asql[inx])
  70. ovals.append(tvl)
  71. asql.remove(tmp)
  72. avals.remove(tvl)
  73. osql.append(tmp)
  74. ovals.append(filter_item['value'])
  75. else:
  76. if tmp in osql:
  77. osql.append(tmp)
  78. ovals.append(filter_item['value'])
  79. else:
  80. asql.append(tmp)
  81. avals.append(filter_item['value'])
  82. if filter_item['filter'] == 2:
  83. tmp = "%s != %%s" % filter_item['field']
  84. if tmp in asql:
  85. inx = asql.index(tmp)
  86. tvl = avals[inx]
  87. nosql.append(asql[inx])
  88. novals.append(tvl)
  89. asql.remove(tmp)
  90. avals.remove(tvl)
  91. nosql.append(tmp)
  92. novals.append(filter_item['value'])
  93. else:
  94. if tmp in nosql:
  95. nosql.append(tmp)
  96. novals.append(filter_item['value'])
  97. else:
  98. asql.append(tmp)
  99. avals.append(filter_item['value'])
  100. if filter_item['filter'] == 3:
  101. tmp = "%s > %%s" % filter_item['field']
  102. if tmp in asql:
  103. inx = asql.index(tmp)
  104. tvl = avals[inx]
  105. osql.append(asql[inx])
  106. ovals.append(tvl)
  107. asql.remove(tmp)
  108. avals.remove(tvl)
  109. osql.append(tmp)
  110. ovals.append(filter_item['value'])
  111. else:
  112. if tmp in osql:
  113. osql.append(tmp)
  114. ovals.append(filter_item['value'])
  115. else:
  116. asql.append(tmp)
  117. avals.append(filter_item['value'])
  118. if filter_item['filter'] == 4:
  119. tmp = "%s < %%s" % filter_item['field']
  120. if tmp in asql:
  121. inx = asql.index(tmp)
  122. tvl = avals[inx]
  123. osql.append(asql[inx])
  124. ovals.append(tvl)
  125. asql.remove(tmp)
  126. avals.remove(tvl)
  127. osql.append(tmp)
  128. ovals.append(filter_item['value'])
  129. else:
  130. if tmp in osql:
  131. osql.append(tmp)
  132. ovals.append(filter_item['value'])
  133. else:
  134. asql.append(tmp)
  135. avals.append(filter_item['value'])
  136. if filter_item['filter'] == 5:
  137. tmp = "%s LIKE %%s" % filter_item['field']
  138. if tmp in asql:
  139. inx = asql.index(tmp)
  140. tvl = avals[inx]
  141. osql.append(asql[inx])
  142. ovals.append(tvl)
  143. asql.remove(tmp)
  144. avals.remove(tvl)
  145. osql.append(tmp)
  146. ovals.append(filter_item['value'])
  147. else:
  148. if tmp in osql:
  149. osql.append(tmp)
  150. ovals.append(filter_item['value'])
  151. else:
  152. asql.append(tmp)
  153. avals.append('%' + filter_item['value'] + '%')
  154. if filter_item['filter'] == 6:
  155. tmp = "%s NOT LIKE %%s" % filter_item['field']
  156. if tmp in asql:
  157. inx = asql.index(tmp)
  158. tvl = avals[inx]
  159. nosql.append(asql[inx])
  160. novals.append(tvl)
  161. asql.remove(tmp)
  162. avals.remove(tvl)
  163. nosql.append(tmp)
  164. novals.append(filter_item['value'])
  165. else:
  166. if tmp in nosql:
  167. nosql.append(tmp)
  168. novals.append(filter_item['value'])
  169. else:
  170. asql.append(tmp)
  171. avals.append('%' + filter_item['value'] + '%')
  172. if filter_item['filter'] == 7:
  173. tmp = "%s REGEXP %%s" % filter_item['field']
  174. if tmp in asql:
  175. inx = asql.index(tmp)
  176. tvl = avals[inx]
  177. osql.append(asql[inx])
  178. ovals.append(tvl)
  179. asql.remove(tmp)
  180. avals.remove(tvl)
  181. osql.append(tmp)
  182. ovals.append(filter_item['value'])
  183. else:
  184. if tmp in osql:
  185. osql.append(tmp)
  186. ovals.append(filter_item['value'])
  187. else:
  188. asql.append(tmp)
  189. avals.append(filter_item['value'])
  190. if filter_item['filter'] == 8:
  191. tmp = "%s NOT REGEXP %%s" % filter_item['field']
  192. if tmp in asql:
  193. inx = asql.index(tmp)
  194. tvl = avals[inx]
  195. nosql.append(asql[inx])
  196. novals.append(tvl)
  197. asql.remove(tmp)
  198. avals.remove(tvl)
  199. nosql.append(tmp)
  200. novals.append(filter_item['value'])
  201. else:
  202. if tmp in nosql:
  203. nosql.append(tmp)
  204. novals.append(filter_item['value'])
  205. else:
  206. asql.append(tmp)
  207. avals.append(filter_item['value'])
  208. if filter_item['filter'] == 9:
  209. tmp = "%s IS NULL" % filter_item['field']
  210. sql.append(tmp)
  211. if filter_item['filter'] == 10:
  212. tmp = "%s IS NOT NULL" % filter_item['field']
  213. sql.append(tmp)
  214. if filter_item['filter'] == 11:
  215. tmp = "%s > 0" % filter_item['field']
  216. sql.append(tmp)
  217. if filter_item['filter'] == 12:
  218. tmp = "%s = 0" % filter_item['field']
  219. sql.append(tmp)
  220. for item in sql:
  221. asql.append(item)
  222. andsql = ' AND '.join(asql)
  223. orsql = ' OR '.join(osql)
  224. nsql = ' AND '.join(nosql)
  225. for item in ovals:
  226. avals.append(item)
  227. for item in novals:
  228. avals.append(item)
  229. if andsql != '':
  230. if orsql != '':
  231. if nsql != '':
  232. sql = andsql + ' AND ( ' + orsql + ' ) AND ( ' + nsql + ' )'
  233. else:
  234. sql = andsql + ' AND ( ' + orsql + ' )'
  235. else:
  236. if nsql != '':
  237. sql = andsql + ' AND ( ' + nsql + ' )'
  238. else:
  239. sql = andsql
  240. else:
  241. if orsql != '':
  242. if nsql != '':
  243. sql = '( ' + orsql + ' ) AND ( ' + nsql + ' )'
  244. else:
  245. sql = '( ' + orsql + ' )'
  246. else:
  247. if nsql != '':
  248. sql = '( ' + nsql + ' )'
  249. else:
  250. sql = ' 1=1 '
  251. return (sql, avals)