hobo/hobo/environment/views.py

201 lines
6.8 KiB
Python

import json
import string
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse_lazy
from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import get_object_or_404
from django.views.generic.base import TemplateView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from .models import Variable, AVAILABLE_SERVICES
from . import forms, utils
class AvailableService(object):
def __init__(self, klass):
self.id = klass.Extra.service_id
self.label = klass._meta.verbose_name
class HomeView(TemplateView):
template_name = 'environment/home.html'
def get_context_data(self, **kwargs):
context = super(HomeView, self).get_context_data(**kwargs)
context['available_services'] = [
AvailableService(x) for x in AVAILABLE_SERVICES if x.is_enabled()]
context['installed_services'] = [x for x in utils.get_installed_services() if not x.secondary]
return context
class VariablesView(TemplateView):
template_name = 'environment/variables.html'
def get_context_data(self, **kwargs):
context = super(VariablesView, self).get_context_data(**kwargs)
context['variables'] = Variable.objects.filter(auto=False,
service_pk__isnull=True).order_by('label')
return context
class VariableCreateView(CreateView):
model = Variable
form_class = forms.VariableForm
def get_form_kwargs(self):
kwargs = super(VariableCreateView, self).get_form_kwargs()
if 'service' in self.kwargs:
service_id = self.kwargs.pop('service')
service_slug = self.kwargs.pop('slug')
for service in AVAILABLE_SERVICES:
if service.Extra.service_id == service_id:
kwargs['service'] = service.objects.get(slug=service_slug)
break
return kwargs
def form_valid(self, form):
if form.service:
service_kwargs = {
'service_pk': form.service.id,
'service_type': ContentType.objects.get_for_model(form.service)
}
else:
service_kwargs = {
'service_pk__isnull': True
}
try:
self.object = Variable.objects.get(
name=form.instance.name,
**service_kwargs)
except Variable.DoesNotExist:
self.object = form.save()
else:
self.object.auto = False
self.object.value = form.instance.value
self.object.save()
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
if self.object.service is None:
return reverse_lazy('environment-variables')
return reverse_lazy('environment-home')
class VariableUpdateView(UpdateView):
model = Variable
form_class = forms.VariableForm
def get_success_url(self):
if self.object.service is None:
return reverse_lazy('environment-variables')
return reverse_lazy('environment-home')
class VariableDeleteView(DeleteView):
model = Variable
template_name = 'environment/generic_confirm_delete.html'
def get_success_url(self):
if self.object.service is None:
return reverse_lazy('environment-variables')
return reverse_lazy('environment-home')
class ServiceCreateView(CreateView):
success_url = reverse_lazy('environment-home')
def get_context_data(self, **kwargs):
context = super(ServiceCreateView, self).get_context_data(**kwargs)
context['model_name'] = self.model._meta.verbose_name
return context
def get_initial(self):
initial = super(ServiceCreateView, self).get_initial()
initial['base_url'] = utils.create_base_url(self.request.build_absolute_uri(), self.model.Extra.service_default_slug)
initial['slug'] = self.model.Extra.service_default_slug
return initial
def get_template_names(self):
return 'environment/service_form.html'
def get(self, request, *args, **kwargs):
self.service_id = kwargs.pop('service')
return super(ServiceCreateView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.service_id = kwargs.pop('service')
return super(ServiceCreateView, self).post(request, *args, **kwargs)
def get_form_class(self):
for service in AVAILABLE_SERVICES:
if service.Extra.service_id == self.service_id:
form_class = getattr(forms, service.__name__ + 'Form')
self.model = form_class.Meta.model
return form_class
return None
class ServiceUpdateView(UpdateView):
success_url = reverse_lazy('environment-home')
def get_context_data(self, **kwargs):
context = super(ServiceUpdateView, self).get_context_data(**kwargs)
context['model_name'] = self.model._meta.verbose_name
return context
def get_template_names(self):
return 'environment/service_form.html'
def get(self, request, *args, **kwargs):
self.service_id = kwargs.pop('service')
self.get_form_class()
return super(ServiceUpdateView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.service_id = kwargs.pop('service')
self.get_form_class()
return super(ServiceUpdateView, self).post(request, *args, **kwargs)
def get_form_class(self):
for service in AVAILABLE_SERVICES:
if service.Extra.service_id == self.service_id:
form_class = getattr(forms, service.__name__ + 'Form')
self.model = form_class.Meta.model
return form_class
return None
class ServiceDeleteView(DeleteView):
success_url = reverse_lazy('environment-home')
template_name = 'environment/generic_confirm_delete.html'
context_object_name = 'object'
def get_object(self):
service_id = self.kwargs.pop('service')
service_slug = self.kwargs.pop('slug')
for service in AVAILABLE_SERVICES:
if service.Extra.service_id == service_id:
return service.objects.get(slug=service_slug)
return None
def operational_check_view(request, service, slug, **kwargs):
for klass in AVAILABLE_SERVICES:
if klass.Extra.service_id == service:
break
else:
raise Http404()
object = get_object_or_404(klass, slug=slug)
object.check_operational()
response = HttpResponse(content_type='application/json')
json.dump({'operational': object.is_operational()}, response)
return response
def debug_json(request):
response = HttpResponse(content_type='application/json')
json.dump((utils.get_installed_services_dict(),), response, indent=2)
return response