| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- from django.contrib.contenttypes.models import ContentType
- from django.db import models
- from django.http import HttpResponse
- from django.template import Template, Context
- from dcim.models import Site
- GRAPH_TYPE_INTERFACE = 100
- GRAPH_TYPE_PROVIDER = 200
- GRAPH_TYPE_SITE = 300
- GRAPH_TYPE_CHOICES = (
- (GRAPH_TYPE_INTERFACE, 'Interface'),
- (GRAPH_TYPE_PROVIDER, 'Provider'),
- (GRAPH_TYPE_SITE, 'Site'),
- )
- EXPORTTEMPLATE_MODELS = [
- 'site', 'rack', 'device', 'consoleport', 'powerport', 'interfaceconnection',
- 'aggregate', 'prefix', 'ipaddress', 'vlan',
- 'provider', 'circuit'
- ]
- class Graph(models.Model):
- type = models.PositiveSmallIntegerField(choices=GRAPH_TYPE_CHOICES)
- weight = models.PositiveSmallIntegerField(default=1000)
- name = models.CharField(max_length=100, verbose_name='Name')
- source = models.CharField(max_length=500, verbose_name='Source URL')
- link = models.URLField(verbose_name='Link URL', blank=True)
- class Meta:
- ordering = ['type', 'weight', 'name']
- def __unicode__(self):
- return self.name
- def embed_url(self, obj):
- template = Template(self.source)
- return template.render(Context({'obj': obj}))
- class ExportTemplate(models.Model):
- content_type = models.ForeignKey(ContentType, limit_choices_to={'model__in': EXPORTTEMPLATE_MODELS})
- name = models.CharField(max_length=200)
- template_code = models.TextField()
- mime_type = models.CharField(max_length=15, blank=True)
- file_extension = models.CharField(max_length=15, blank=True)
- class Meta:
- ordering = ['content_type', 'name']
- unique_together = [
- ['content_type', 'name']
- ]
- def __unicode__(self):
- return "{}: {}".format(self.content_type, self.name)
- def to_response(self, context_dict, filename):
- """
- Render the template to an HTTP response, delivered as a named file attachment
- """
- template = Template(self.template_code)
- mime_type = 'text/plain' if not self.mime_type else self.mime_type
- response = HttpResponse(
- template.render(Context(context_dict)),
- content_type=mime_type
- )
- if self.file_extension:
- filename += '.{}'.format(self.file_extension)
- response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
- return response
- class TopologyMap(models.Model):
- name = models.CharField(max_length=50, unique=True)
- slug = models.SlugField(unique=True)
- site = models.ForeignKey(Site, related_name='topology_maps', blank=True, null=True)
- device_patterns = models.TextField(help_text="Identify devices to include in the diagram using regular expressions,"
- "one per line. Each line will result in a new tier of the drawing. "
- "Separate multiple regexes on a line using commas. Devices will be "
- "rendered in the order they are defined.")
- description = models.CharField(max_length=100, blank=True)
- class Meta:
- ordering = ['name']
- def __unicode__(self):
- return self.name
- @property
- def device_sets(self):
- if not self.device_patterns:
- return None
- return [line.strip() for line in self.device_patterns.split('\n')]
|