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

Generated: Sun 2014-03-16 19:26 GMT

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

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