ftp_deploy.server.views.service: 146 total statements, 39.5% covered

Generated: Thu 2013-12-19 21:13 GMT

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

Stats: 51 executed, 78 missed, 17 excluded, 87 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, get_object_or_404
  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, 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. success_url = reverse_lazy('ftpdeploy_dashboard')
  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. class ServiceEditView(LoginRequiredMixin, UpdateView):
  50. """View for edit services"""
  51. model = Service
  52. form_class = ServiceForm
  53. template_name = "ftp_deploy/service/form.html"
  54. def get_success_url(self):
  55. return reverse('ftpdeploy_service_manage', kwargs={'pk': self.kwargs['pk']})
  56. def form_valid(self, form):
  57. messages.add_message(self.request, messages.SUCCESS, 'Service has been updated.')
  58. return super(ServiceEditView, self).form_valid(form)
  59. class ServiceDeleteView(LoginRequiredMixin, DeleteView):
  60. """View for delete services"""
  61. model = Service
  62. success_url = reverse_lazy('ftpdeploy_dashboard')
  63. template_name = "ftp_deploy/service/delete.html"
  64. def delete(self, request, *args, **kwargs):
  65. messages.add_message(request, messages.SUCCESS, 'Service has been removed.')
  66. return super(ServiceDeleteView, self).delete(request, *args, **kwargs)
  67. class ServiceStatusView(JSONResponseMixin, LoginRequiredMixin, SingleObjectMixin, View):
  68. """View for update(save) and check service status"""
  69. model = Service
  70. def post(self, request, *args, **kwargs):
  71. service = self.get_object()
  72. service.save()
  73. response = request.POST.get('response', '')
  74. if response == 'list':
  75. services = list()
  76. services.append(service)
  77. return render_to_response('ftp_deploy/service/list.html', locals(), context_instance=RequestContext(request))
  78. if response == 'manage':
  79. recent_logs = service.log_set.all()[:15]
  80. fail_logs = service.log_set.filter(status=0).filter(skip=0)
  81. return render_to_response('ftp_deploy/service/manage.html', locals(), context_instance=RequestContext(request))
  82. if response == 'json':
  83. context = {
  84. 'status': service.status,
  85. 'status_message': service.status_message,
  86. 'updated': service.updated
  87. }
  88. return self.render_json_response(context)
  89. raise Http404
  90. class ServiceRestoreView(LoginRequiredMixin, DetailView):
  91. """"View for build restore path for service"""
  92. model = Service
  93. prefetch_related = ["log_set"]
  94. template_name = "ftp_deploy/service/restore-modal.html"
  95. def get_context_data(self, **kwargs):
  96. context = super(ServiceRestoreView, self).get_context_data(**kwargs)
  97. logs = self.get_logs_tree()
  98. context['payload'] = json.loads(logs[0].payload)
  99. context['payload']['user'] = 'Restore'
  100. context['service'] = self.get_object()
  101. commits = list()
  102. for log in logs:
  103. payload = json.loads(log.payload)
  104. commits += payload['commits']
  105. context['payload']['commits'] = commits
  106. context['payload'] = json.dumps(context['payload'])
  107. context['files_added'], context['files_modified'], context['files_removed'] = commits_parser(commits).file_diff()
  108. context['commits_info'] = commits_parser(commits).commits_info()
  109. return context
  110. def post(self, request, *args, **kwargs):
  111. if request.POST['payload']:
  112. self.get_logs_tree().delete()
  113. return HttpResponse(reverse('ftpdeploy_deploy', args=(self.get_object().secret_key,)))
  114. def get_logs_tree(self):
  115. """get logs tree for restore deploys. Include all logs since first fail apart of skiped."""
  116. first_fail_log = self.get_object().log_set.filter(status=0).filter(skip=0).order_by('pk')[:1]
  117. logs = self.get_object().log_set.filter(skip=0).filter(pk__gte=first_fail_log[0].pk).order_by('pk')
  118. return logs
  119. class ServiceNotificationView(LoginRequiredMixin, UpdateView):
  120. model = Service
  121. form_class = ServiceNotificationForm
  122. template_name = "ftp_deploy/notification/notification-modal.html"
  123. def get_success_url(self):
  124. return reverse('ftpdeploy_service_manage', kwargs={'pk': self.kwargs['pk']})
  125. def form_valid(self, form):
  126. self.object.check = False
  127. messages.add_message(self.request, messages.SUCCESS, 'Service notification has been updated.')
  128. return super(ServiceNotificationView, self).form_valid(form)
  129. class BitbucketAPIView(LoginRequiredMixin, JSONResponseMixin, SingleObjectMixin, View):
  130. """View for managing BitBucket API"""
  131. model = Service
  132. def dispatch(self, *args, **kwargs):
  133. self.bitbucket_username = BITBUCKET_SETTINGS['username']
  134. self.bitbucket_password = BITBUCKET_SETTINGS['password']
  135. return super(BitbucketAPIView, self).dispatch(*args, **kwargs)
  136. def post(self, request, *args, **kwargs):
  137. try:
  138. curl = curl_connection(self.bitbucket_username, self.bitbucket_password)
  139. curl.authenticate()
  140. post = str()
  141. if self.request.POST['data'] == 'respositories':
  142. context = self.repositories(curl)
  143. elif self.request.POST['data'] == 'addhook':
  144. context = self.add_hook(curl, request)
  145. return self.render_json_response(context)
  146. finally:
  147. curl.close()
  148. return HttpResponse()
  149. def repositories(self, curl):
  150. """Load list of repositories from bitbucket account"""
  151. url = 'https://bitbucket.org/api/1.0/user/repositories'
  152. context = curl.perform(url)
  153. return context
  154. def add_hook(self, curl, request):
  155. """Add hook and change repo_hook flag for service"""
  156. service = self.get_object()
  157. url = 'https://api.bitbucket.org/1.0/repositories/%s/%s/services/ ' % (self.bitbucket_username, self.get_object().repo_slug_name)
  158. post = 'type=POST&URL=%s%s' % (absolute_url(request).build(), service.hook_url())
  159. service.repo_hook = True
  160. service.save()
  161. context = curl.perform_post(url, post)
  162. return context