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

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

Added more filter options on jobs controller.

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
95    def index(self):
96        (args, bad_args) = self._parseArgs()
97#        return str(args)
98        (filtered_jobs, total_matches) = apply(self._filterJobs, [], args)
99
100        renderer = UIPageRenderer()
101        return renderer.renderJobsPage(filtered_jobs, total_matches, args, bad_args)
102   
103   
104    def _parseArgs(self):
105        args = {}
106        bad_args = {}
107   
108        for (key, default) in self.default_args.items():
109            value = None
110
111            if request.params.has_key(key):
112                value = str(request.params.getone(key).strip())
113
114                # If arg_check is False then bad input
115                arg_check = apply(self.arg_processers[key], [value])
116
117                if arg_check == False or value == "":
118                    bad_args[key] = value
119                    value = default
120                else:
121                    value = arg_check
122            else:
123                value = default
124           
125            args[key] = value
126           
127        return (args, bad_args)
128   
129
130    def _orderJobs(self, jobs, order_by):
131        reverse = False
132
133        if order_by.find("_rev") > -1:
134            order_by = order_by.replace("_rev", "")
135            reverse = True
136
137        indx = self.job_item_order[order_by] 
138        tmp_jobs = [(job[indx], job[:]) for job in jobs]
139        tmp_jobs.sort()
140
141        if reverse:
142            tmp_jobs.reverse()
143         
144        ordered_jobs = [i[1] for i in tmp_jobs]
145        return ordered_jobs
146   
147   
148    def _filterJobs(self, start, n_records, job_desc_match, job_id_match,
149                    job_type, job_status, sub_before, sub_after, order_by):
150        # Get all jobs at start
151        requests = requestManager.getAllRequest()
152       
153        # Define jobs as tuple of (job_id, user, status, job_type, created)
154        # And convert all unicodes
155        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]
156         
157        for filtr in ("job_id_match", "job_type", "job_status", "sub_before", "sub_after"):
158            jobs = self._filterBy(jobs, filtr, filter_value = vars()[filtr])
159       
160        total_matches = len(jobs)       
161        ordered_jobs = self._orderJobs(jobs, order_by)[start:(start + n_records)]
162        return (ordered_jobs, total_matches)
163   
164   
165    def _filterBy(self, jobs, filtr, filter_value):
166        # Represent jobs as lists of properties
167        if filter_value == None:
168            return jobs
169       
170        indx = self.job_item_order[filtr]
171        test_param = None
172        filter_type = self.filter_types[filtr]
173        filtered_jobs = []
174
175        for job in jobs:
176       
177            item = job[indx]
178       
179            if filter_type == "regex":
180                if not test_param:
181                    test_param = re.compile(filter_value)
182       
183                if test_param.search(item):
184                    filtered_jobs.append(job)
185           
186            elif filter_type.find("time:") == 0:
187                if not test_param:
188                    test_param = filter_value
189       
190                when = filter_type.split(":")[1].strip()
191       
192                if when == "after":
193                    if item > test_param:
194                        filtered_jobs.append(job)
195           
196                elif when == "before":
197                    if item < test_param:
198                        filtered_jobs.append(job)
199           
200            elif filter_type == "equality":
201                if filter_value == item:
202                    filtered_jobs.append(job)
203           
204            elif filter_type == "contains":
205#                raise str(str(item) + str(filter_value))
206                if item in filter_value:
207                    filtered_jobs.append(job)
208
209        return filtered_jobs
210
Note: See TracBrowser for help on using the repository browser.