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

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

fixed admin interface

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