views.py 4.69 KB
Newer Older
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
1
from datetime import datetime, time
2
from django.shortcuts import render, HttpResponseRedirect, reverse, HttpResponse
3
from django.http import JsonResponse, FileResponse
4
from django.views.generic import ListView, CreateView, UpdateView
5
from django.contrib.auth.decorators import login_required
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
6
from django.utils.decorators import method_decorator
7 8

from .models import Spider, Job
9
from .service import Service
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
10
from .forms import CreateJobForm
11
from .periodic_task_creator import make_periodic_task
12 13


14
@method_decorator(login_required, name='post')
15
class JobListView(ListView):
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
16
    template_name = 'list_jobs.html'
17 18 19
    model = Job

    def __init__(self):
20
        self.service = Service()
21 22 23
        super(JobListView, self).__init__()

    def get(self, request, *args, **kwargs):
24 25 26 27 28
        action = request.GET.get('action')
        job_id = request.GET.get('id')
        if action:
            log = self.service.get_log(job_id)
            return HttpResponse(log, content_type='text/plain')
29
        self.service.update_jobs_status()
30
        j = Job.objects.all().order_by('-create_time')
31
        jobs = {
32 33 34 35
            'deleted': j.deleted(),
            'running': j.running(),
            'finished': j.finished(),
            'pending': j.pending()
36
        }
37
        return render(request, self.template_name, {'jobs': jobs})
38 39

    def post(self, request, *args, **kwargs):
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
40 41 42
        if request.is_ajax():
            action = request.POST.get('action')
            job_id = request.POST.get('id')
43
            return self._logic(action, job_id)
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
44
        return HttpResponseRedirect(reverse('job_list'))
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
45 46

    def _logic(self, action, job_id):
47
        if action == 'run':
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
48
            return JsonResponse(self.service.run_job(job_id))
49
        if action == 'cancel':
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
50
            return JsonResponse(self.service.cancel_job(job_id))
51
        if action == 'update':
52
            self.service.update_jobs_status()
53
        if action == 'delete':
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
54
            return JsonResponse(self.service.delete_job(job_id))
55 56
        if action == 'activate':
            return JsonResponse(self.service.activate_job(job_id))
57 58
        if action == 'new':
            return HttpResponseRedirect(reverse('new_job'))
59 60
        if action == 'restart':
            return JsonResponse(self.service.restart_job(job_id))
61
        if action == 'log':
62
            log = self.service.get_log(job_id)
63
            return FileResponse(log)
64 65


66
@method_decorator(login_required, name='dispatch')
67 68 69 70
class NewJobCreateView(CreateView):
    template_name = 'new_job.html'

    def get(self, request, *args, **kwargs):
71 72
        spiders = Spider.objects.all()
        return render(request, self.template_name, {'spiders': spiders})
73 74

    def post(self, request, *args, **kwargs):
75
        name = request.POST.get('name')
76
        spider = Spider.objects.get(pk=request.POST.get('spider'))
77
        query = request.POST.get('query')
78
        job = Job.objects.create(name=name, spider=spider, query=query)
79 80
        interval = request.POST.get('interval')
        every = request.POST.get('count')
81
        every = int(every) if every else None
82 83
        job.schedule_job = make_periodic_task(job.id, schedule(interval, every))
        job.save()
84

85
        return HttpResponseRedirect(reverse('job_list'))
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103


@method_decorator(login_required, name='dispatch')
class EditJobView(UpdateView):
    template_name = 'edit_job.html'

    def get(self, request, *args, **kwargs):
        job = Job.objects.get(pk=kwargs.get('id'))
        spiders = Spider.objects.all().exclude(sp_name=job.spider.sp_name)
        return render(request, self.template_name, {'job': job, 'spiders': spiders})

    def post(self, request, *args, **kwargs):
        name = request.POST.get('name')
        spider = Spider.objects.get(pk=request.POST.get('spider'))
        query = request.POST.get('query')
        job = Job.objects.filter(pk=request.POST.get('job'))
        job.update(name=name, spider=spider, query=query)
        return HttpResponseRedirect(reverse('edit_job', kwargs={'id': request.POST.get('job')}))
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118


def schedule(interval, every):
    DAY = 'day'
    WEEK = 'week'
    MONTH = 'month'
    scheduler = {
        'minute': 0,
        'hour': 0,
        'day_of_month': '*',
        'month_of_year': '*',
        'day_of_week': '*'
    }

    if interval == DAY:
119
        scheduler['day_of_month'] = '*/{}'.format(every) if every else '*'
120
    if interval == WEEK:
121 122 123 124 125
        if every > 4:
            every = 4
        if every < 1:
            every = 1
        scheduler['day_of_month'] = '*/{}'.format(every * 7) if every else '*'
126
    if interval == MONTH:
127 128 129 130 131 132
        if every > 12:
            every = 12
        if every < 1:
            every = 1
        scheduler['day_of_month'] = 0
        scheduler['month_of_year'] = '*/{}'.format(every) if every else '*'
133
    return scheduler