ftp_deploy.server.views.service: 118 total statements, 100.0% covered

Generated: Sun 2014-01-12 11:05 GMT

Source file: /var/www/service.dev/service/ftp_deploy/server/views/service.py

Stats: 101 executed, 0 missed, 17 excluded, 68 ignored

  1. import json
  2. from django.views.generic.base import View, TemplateResponseMixin, TemplateView
  3. from django.views.generic.edit import ModelFormMixin, ProcessFormView
  4. from django.views.generic.detail import SingleObjectMixin, SingleObjectTemplateResponseMixin
  5. from django.views.generic import ListView, UpdateView, DeleteView, DetailView, CreateView, FormView
  6. from django.core.urlresolvers import reverse_lazy, reverse
  7. from django.shortcuts import render_to_response, render
  8. from django.template import RequestContext
  9. from django.contrib import messages
  10. from django.db.models import Max
  11. from django.http import HttpResponse, HttpResponseRedirect, Http404
  12. from braces.views import JSONResponseMixin, LoginRequiredMixin
  13. from ftp_deploy.conf import *
  14. from ftp_deploy.models import Service, Log, Notification
  15. from ftp_deploy.utils.curl import curl_connection
  16. from ftp_deploy.utils.core import commits_parser, absolute_url
  17. from ftp_deploy.server.forms import ServiceForm, ServiceNotificationForm
  18. class DashboardView(LoginRequiredMixin, ListView):
  19. """View for dashboard"""
  20. model = Service
  21. queryset = Service.objects.all().select_related().order_by("status", "-log__created").annotate(date=Max('log__created'))
  22. context_object_name = 'services'
  23. template_name = "ftp_deploy/dashboard.html"
  24. paginate_by = 25
  25. def post(self, request, *args, **kwargs):
  26. services = self.get_queryset()
  27. if self.request.POST['services']:
  28. services = services.filter(pk=self.request.POST['services'])
  29. return render_to_response('ftp_deploy/service/list.html', locals(), context_instance=RequestContext(request))
  30. class ServiceManageView(LoginRequiredMixin, DetailView):
  31. """View for manage services"""
  32. model = Service
  33. context_object_name = 'service'
  34. template_name = "ftp_deploy/service/manage.html"
  35. def get_context_data(self, **kwargs):
  36. context = super(ServiceManageView, self).get_context_data(**kwargs)
  37. context['recent_logs'] = self.object.log_set.all()[:15]
  38. context['fail_logs'] = self.object.log_set.filter(status=0).filter(skip=0)
  39. return context
  40. class ServiceAddView(LoginRequiredMixin, CreateView):
  41. """View for add serives"""
  42. model = Service
  43. form_class = ServiceForm
  44. template_name = "ftp_deploy/service/form.html"
  45. def form_valid(self, form):
  46. messages.add_message(self.request, messages.SUCCESS, 'Service has been added.')
  47. return super(ServiceAddView, self).form_valid(form)
  48. def get_success_url(self):
  49. self.object.check()
  50. self.object.save()
  51. return reverse('ftpdeploy_service_manage', kwargs={'pk': self.object.pk})
  52. class ServiceEditView(LoginRequiredMixin, UpdateView):
  53. """View for edit services"""
  54. model = Service
  55. form_class = ServiceForm
  56. template_name = "ftp_deploy/service/form.html"
  57. def form_valid(self, form):
  58. self.object.check()
  59. self.object.save()
  60. messages.add_message(self.request, messages.SUCCESS, 'Service has been updated.')
  61. return HttpResponseRedirect(self.get_success_url())
  62. def get_success_url(self):
  63. return reverse('ftpdeploy_service_manage', kwargs={'pk': self.kwargs['pk']})
  64. class ServiceDeleteView(LoginRequiredMixin, DeleteView):
  65. """View for delete services"""
  66. model = Service
  67. success_url = reverse_lazy('ftpdeploy_dashboard')
  68. template_name = "ftp_deploy/service/delete.html"
  69. def delete(self, request, *args, **kwargs):
  70. messages.add_message(request, messages.SUCCESS, 'Service has been removed.')
  71. return super(ServiceDeleteView, self).delete(request, *args, **kwargs)
  72. class ServiceStatusView(JSONResponseMixin, LoginRequiredMixin, SingleObjectMixin, View):
  73. """View for update(save) and check service status"""
  74. model = Service
  75. def post(self, request, *args, **kwargs):
  76. service = self.get_object()
  77. service.check()
  78. service.save()
  79. response = request.POST.get('response', '')
  80. if response == 'list':
  81. services = [service]
  82. return render_to_response('ftp_deploy/service/list.html', locals(), context_instance=RequestContext(request))
  83. if response == 'manage':
  84. manage_view = ServiceManageView()
  85. manage_view.object = service
  86. context = manage_view.get_context_data()
  87. return render_to_response('ftp_deploy/service/manage.html', context, context_instance=RequestContext(request))
  88. if response == 'json':
  89. context = {
  90. 'status': service.status,
  91. 'status_message': service.status_message,
  92. 'updated': service.updated
  93. }
  94. return self.render_json_response(context)
  95. raise Http404
  96. class ServiceRestoreView(LoginRequiredMixin, DetailView):
  97. """"View for build restore path for service"""
  98. model = Service
  99. prefetch_related = ["log_set"]
  100. template_name = "ftp_deploy/service/restore-modal.html"
  101. def get_context_data(self, **kwargs):
  102. context = super(ServiceRestoreView, self).get_context_data(**kwargs)
  103. service = self.get_object()
  104. logs = service.get_logs_tree()
  105. # init payload dictionary
  106. context['payload'] = json.loads(logs[0].payload)
  107. context['payload']['user'] = 'Restore'
  108. context['service'] = service
  109. commits = list()
  110. for log in logs:
  111. payload = json.loads(log.payload)
  112. commits += payload['commits']
  113. context['payload']['commits'] = commits
  114. context['payload'] = json.dumps(context['payload'])
  115. context['files_added'], context['files_modified'], context['files_removed'] = commits_parser(commits).file_diff()
  116. context['commits_info'] = commits_parser(commits).commits_info()
  117. return context
  118. def post(self, request, *args, **kwargs):
  119. if request.POST['payload']:
  120. self.get_object().get_logs_tree().delete()
  121. return HttpResponse(reverse('ftpdeploy_deploy', kwargs={'secret_key':self.get_object().secret_key}))
  122. class ServiceNotificationView(LoginRequiredMixin, UpdateView):
  123. model = Service
  124. form_class = ServiceNotificationForm
  125. template_name = "ftp_deploy/notification/notification-modal.html"
  126. def form_valid(self, form):
  127. messages.add_message(self.request, messages.SUCCESS, 'Service notification has been updated.')
  128. return super(ServiceNotificationView, self).form_valid(form)
  129. def get_success_url(self):
  130. return reverse('ftpdeploy_service_manage', kwargs={'pk': self.kwargs['pk']})