source: cows_wps/trunk/cows_wps/controllers/jobs.py @ 7097

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows_wps/trunk/cows_wps/controllers/jobs.py@7097
Revision 7097, 6.2 KB checked in by astephen, 9 years ago (diff)

added admin interface - still needs a db to talk to.

Line 
1import logging
2import re
3
4from pylons import request, response, session, tmpl_context as c
5from pylons.controllers.util import abort, redirect_to
6
7from cows_wps.renderer.ui_renderer import *
8from cows_wps.controllers import *
9from cows_wps.lib.ui.proc_config import *
10
11from cows_wps.model.managers import requestManager
12from cows_wps.process_handler.context.process_status import STATUS
13from cows_wps.process_handler.validate_arguments import parseDateTime
14
15log = logging.getLogger(__name__)
16
17
18def checkValidJobStatus(status):
19    allowed_status_codes = [code for code in STATUS.__dict__.keys() if code[0] != "_"]
20    status = status.split("|")
21
22    for st in status:
23        if st not in allowed_status_codes:
24            return False
25
26    return status
27   
28   
29def checkValidJobType(jtype):
30    allowed_job_types = ["1", "2"]
31    job_types = jtype.split("|")
32
33    for jtype in job_types:
34        if jtype not in allowed_job_types:
35            return False
36
37    return job_types
38
39
40def checkValidOrderBy(order_by):
41    allowed = ["job_id", "user_id", "job_status", "job_type", "sub_time"]
42    new_allowed = []
43
44    for i in allowed:
45        new_allowed.append("%s_rev" % i)
46
47    allowed.extend(new_allowed)
48
49    if order_by not in allowed:
50        return False
51
52    return order_by
53
54   
55def toDateTime(tm):
56    try:
57        return parseDateTime(tm)
58    except:
59        return False
60   
61
62class JobsController(BaseController):
63
64    job_item_order = {"job_id_match": 0, "user_id": 1, "job_status": 2,
65                      "job_type": 3, "sub_before": 4, "sub_after": 4,
66                      "job_id": 0, "sub_time": 4}
67
68    filter_types = {"job_id_match": "regex", 
69                    "job_desc_match": "regex",
70            "job_type": "contains",
71            "job_status": "contains",           
72            "sub_after": "time:after",
73            "sub_before": "time:before",
74            }
75    default_args = {"start": 0,
76                    "n_records": 20,
77            "job_desc_match": None,
78            "job_id_match": None,
79            "job_type": None,
80            "job_status": None,
81            "sub_before": None,
82            "sub_after": None,
83            "order_by": "sub_time"}
84    arg_processers = {"start": int,
85                    "n_records": int,
86            "job_desc_match": str,
87            "job_id_match": str,
88            "job_type": checkValidJobType,
89            "job_status": checkValidJobStatus,
90            "sub_before": toDateTime,
91            "sub_after": toDateTime,
92            "order_by": checkValidOrderBy}
93
94    def index(self):
95        (args, bad_args) = self._parseArgs()
96#        return str(args)
97        (filtered_jobs, total_matches) = apply(self._filterJobs, [], args)
98
99        renderer = UIPageRenderer()
100        return renderer.renderJobsPage(filtered_jobs, total_matches, args, bad_args)
101   
102   
103    def _parseArgs(self):
104        args = {}
105        bad_args = {}
106   
107        for (key, default) in self.default_args.items():
108            value = None
109            if request.params.has_key(key):
110                value = str(request.params.getone(key))
111           
112                # If arg_check is False then bad input
113                arg_check = apply(self.arg_processers[key], [value])
114                if arg_check == False:
115                    bad_args[key] = value
116                    value = default
117                else:
118                    value = arg_check
119            else:
120                value = default
121           
122            args[key] = value
123           
124        return (args, bad_args)
125   
126
127    def _orderJobs(self, jobs, order_by):
128        reverse = False
129
130        if order_by.find("_rev") > -1:
131            order_by = order_by.replace("_rev", "")
132            reverse = True
133
134        indx = self.job_item_order[order_by] 
135        tmp_jobs = [(job[indx], job[:]) for job in jobs]
136        tmp_jobs.sort()
137
138        if reverse:
139            tmp_jobs.reverse()
140         
141        ordered_jobs = [i[1] for i in tmp_jobs]
142        return ordered_jobs
143   
144   
145    def _filterJobs(self, start, n_records, job_desc_match, job_id_match,
146                    job_type, job_status, sub_before, sub_after, order_by):
147        # Get all jobs at start
148        requests = requestManager.getAllRequest()
149       
150        # Define jobs as tuple of (job_id, user, status, job_type, created)
151        # And convert all unicodes
152        jobs = [[str(i) for i in (r.job_id, r.user_id, r.job.status, r.job.type, r.job.created)] for r in requests]
153         
154        for filtr in ("job_id_match", "job_type", "job_status", "sub_before", "sub_after"):
155            jobs = self._filterBy(jobs, filtr, filter_value = vars()[filtr])
156       
157        total_matches = len(jobs)       
158        ordered_jobs = self._orderJobs(jobs, order_by)[start:(start + n_records)]
159        return (ordered_jobs, total_matches)
160   
161   
162    def _filterBy(self, jobs, filtr, filter_value):
163        # Represent jobs as lists of properties
164        if filter_value == None:
165            return jobs
166       
167        indx = self.job_item_order[filtr]
168        test_param = None
169        filter_type = self.filter_types[filtr]
170        filtered_jobs = []
171
172        for job in jobs:
173       
174            item = job[indx]
175       
176            if filter_type == "regex":
177                if not test_param:
178                    test_param = re.compile(filter_value)
179       
180                if test_param.search(item):
181                    filtered_jobs.append(job)
182           
183            elif filter_type.find("time:") == 0:
184                if not test_param:
185                    test_param = filter_value
186       
187                when = filter_type.split(":")[1].strip()
188       
189                if when == "after":
190                    if item > test_param:
191                        filtered_jobs.append(job)
192           
193                elif when == "before":
194                    if item < test_param:
195                        filtered_jobs.append(job)
196           
197            elif filter_type == "equality":
198                if filter_value == item:
199                    filtered_jobs.append(job)
200           
201            elif filter_type == "contains":
202#                raise str(str(item) + str(filter_value))
203                if item in filter_value:
204                    filtered_jobs.append(job)
205
206        return filtered_jobs
207
Note: See TracBrowser for help on using the repository browser.