renderers.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import json
  2. from rest_framework import renderers
  3. # IP address family designations
  4. AF = {
  5. 4: 'A',
  6. 6: 'AAAA',
  7. }
  8. class BINDZoneRenderer(renderers.BaseRenderer):
  9. """
  10. Generate a BIND zone file from a list of DNS records.
  11. Required fields: `name`, `primary_ip`
  12. """
  13. media_type = 'text/plain'
  14. format = 'bind-zone'
  15. def render(self, data, media_type=None, renderer_context=None):
  16. records = []
  17. for record in data:
  18. if record.get('name') and record.get('primary_ip'):
  19. try:
  20. records.append("{} IN {} {}".format(
  21. record['name'],
  22. AF[record['primary_ip']['family']],
  23. record['primary_ip']['address'].split('/')[0],
  24. ))
  25. except KeyError:
  26. pass
  27. return '\n'.join(records)
  28. class FlatJSONRenderer(renderers.BaseRenderer):
  29. """
  30. Flattens a nested JSON reponse.
  31. """
  32. format = 'json_flat'
  33. media_type = 'application/json'
  34. def render(self, data, media_type=None, renderer_context=None):
  35. def flatten(entry):
  36. for key, val in entry.iteritems():
  37. if isinstance(val, dict):
  38. for child_key, child_val in flatten(val):
  39. yield "{}_{}".format(key, child_key), child_val
  40. else:
  41. yield key, val
  42. return json.dumps([dict(flatten(i)) for i in data])