Commit 9998a1e27ee1c70ae8a8764129065ba0b03b592d

Authored by Macieski
1 parent 810ff586
Exists in master

filtering computers classes and props

Showing 1 changed file with 81 additions and 63 deletions   Show diff stats
wscserver/view/restfulview.py
... ... @@ -2,6 +2,7 @@ from pyramid_restler.view import RESTfulView
2 2 from collections import defaultdict
3 3 import json
4 4 import hashlib
  5 +from itertools import groupby
5 6  
6 7 class CustomRESTfulView(RESTfulView):
7 8  
... ... @@ -10,70 +11,87 @@ class CustomRESTfulView(RESTfulView):
10 11 para as classes WMI
11 12 """
12 13  
13   - def render_json(self, value):
14   -
15   - dados_banco = json.loads(self.context.to_json(value, self.fields,
16   - wrap=False))
17   -
18   - saida = {}
19   - results = []
20   -
21   - for computador in dados_banco:
22   - # Cria as chaves dos computadores
23   - saida[computador['id_computador']] = {}
24   -
25   - for computador in dados_banco:
26   - # Cria as chaves de classes nos computadores
27   - saida[computador['id_computador']][computador['nm_class_name']] = {}
28   -
29   - for x in dados_banco:
30   - # cria as chaves de propriedades nas classes
31   - class_name = x['nm_class_name']
32   - saida[x['id_computador']][x['nm_class_name']][
33   - class_name +'_'+ x['nm_property_name']] = x['te_class_property_value']
34   -
35   - # Ordena os objetos json
36   - for computador in saida:
37   - classes = {}
38   -
39   - # Gera um hash para o id_computador
40   - salt = str('salthere').encode('utf-8')
41   - id_reg = str(computador).encode('utf-8')
42   - id_reg = hashlib.sha512(id_reg)
43   - id_reg.update(salt)
44   - id_reg = id_reg.hexdigest()
45   - classes['id_reg'] = id_reg
46   -
47   - for classe in saida[computador]:
48   - if classe != 'data_coleta':
49   - # Aqui estou nas classes
50   - classes[classe] = saida[computador][classe]
51   -
52   - results.append(classes)
53   -
54   - valores = {
55   - 'results': results,
56   - 'result_count': len(results)
  14 + # Computer class and properties filters
  15 + computer_filter = {
  16 + "OperatingSystem": [
  17 + "Caption",
  18 + "Version",
  19 + "InstallDate",
  20 + # quantidade ???
  21 + ],
  22 + "Win32_Processor": [
  23 + "Manufacturer",
  24 + "Caption",
  25 + "NumberOfLogicalProcessors",
  26 + # idade ??
  27 + ],
  28 + "Win32_BIOS": [
  29 + "Manufacturer",
  30 + ],
  31 + }
  32 +
  33 + def render_json(self, collection):
  34 +
  35 + """
  36 + :param collection: List of <wscserver.model.Coleta.Coleta object>
  37 + collection element attributes example:
  38 +
  39 + "id_class": 3,
  40 + "id_computador_coleta_historico": 1,
  41 + "nm_class_name": "NetworkAdapterConfiguration",
  42 + "nm_property_name": "Description",
  43 + "id_computador_coleta": 1,
  44 + "id_class_property": 6,
  45 + "dt_hr_inclusao": "2014-07-18 12:34:43",
  46 + "id_computador": 3,
  47 + "te_class_property_value": " "Intel(R) 82579V Gigabit Network Connection"
  48 + """
  49 +
  50 + def keyfunc(obj):
  51 + # Will group by computer ID
  52 + return int(obj.id_computador)
  53 +
  54 + # Sort list before grouping
  55 + collection = sorted(collection, key=keyfunc)
  56 +
  57 + # Create result list
  58 + computers = [ ]
  59 +
  60 + # Navigate groups
  61 + for id_computador, computer_group in groupby(collection, keyfunc):
  62 +
  63 + computer = { }
  64 +
  65 + for collection_element in list(computer_group):
  66 +
  67 + class_ = collection_element.nm_class_name
  68 + property_ = collection_element.nm_property_name
  69 + property_value = collection_element.te_class_property_value
  70 +
  71 + if class_ not in self.computer_filter:
  72 + # Filter classes
  73 + continue
  74 +
  75 + if property_ not in self.computer_filter[class_]:
  76 + # Filter properties
  77 + continue
  78 +
  79 + if computer.get(class_) is None:
  80 + computer[class_] = { }
  81 + else:
  82 + prefixed_property = class_ + '_' + property_
  83 + computer[class_][prefixed_property] = property_value
  84 +
  85 + computers.append(computer)
  86 +
  87 + response = {
  88 + 'results': computers,
  89 + 'result_count': len(computers)
57 90 }
58 91  
59   - results = valores['results']
60   - for computador in results:
61   -
62   - SoftwareList = computador['SoftwareList']
63   - new_SoftwareList = [ ]
64   -
65   - for soft_key, soft_value in SoftwareList.items():
66   -
67   - new_SoftwareList_element = {
68   - 'softwarelist_name': soft_value
69   - }
70   - new_SoftwareList.append(new_SoftwareList_element)
71   -
72   - computador['SoftwareList'] = new_SoftwareList
73   -
74   -
75   - response_data = dict(
76   - body=json.dumps(valores),
  92 + return dict(
  93 + body=json.dumps(response),
77 94 content_type='application/json'
78 95 )
79   - return response_data
  96 +
  97 +
... ...