xref: /aosp_15_r20/external/autotest/frontend/afe/views.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Liimport httplib2, os, sys, traceback, cgi
2*9c5db199SXin Li
3*9c5db199SXin Lifrom django.http import HttpResponse, HttpResponsePermanentRedirect
4*9c5db199SXin Lifrom django.http import HttpResponseServerError
5*9c5db199SXin Lifrom django.template import Context, loader
6*9c5db199SXin Lifrom autotest_lib.client.common_lib import utils
7*9c5db199SXin Lifrom autotest_lib.frontend import views_common
8*9c5db199SXin Lifrom autotest_lib.frontend.afe import models, rpc_handler, rpc_interface
9*9c5db199SXin Lifrom autotest_lib.frontend.afe import rpc_utils
10*9c5db199SXin Li
11*9c5db199SXin Lirpc_handler_obj = rpc_handler.RpcHandler((rpc_interface, ),
12*9c5db199SXin Li                                         document_module=rpc_interface)
13*9c5db199SXin Li
14*9c5db199SXin Li
15*9c5db199SXin Lidef handle_rpc(request):
16*9c5db199SXin Li    """Handle the RPC request.
17*9c5db199SXin Li
18*9c5db199SXin Li    @param request: the RPC request.
19*9c5db199SXin Li    """
20*9c5db199SXin Li    return rpc_handler_obj.handle_rpc_request(request)
21*9c5db199SXin Li
22*9c5db199SXin Li
23*9c5db199SXin Lidef rpc_documentation(request):
24*9c5db199SXin Li    """Return the rpc documentation.
25*9c5db199SXin Li
26*9c5db199SXin Li    @param request: the RPC request.
27*9c5db199SXin Li    """
28*9c5db199SXin Li    return rpc_handler_obj.get_rpc_documentation()
29*9c5db199SXin Li
30*9c5db199SXin Li
31*9c5db199SXin Lidef model_documentation(request):
32*9c5db199SXin Li    """Get the model documentation.
33*9c5db199SXin Li
34*9c5db199SXin Li    @param request: the RPC request.
35*9c5db199SXin Li    """
36*9c5db199SXin Li    model_names = ('Label', 'Host', 'Test', 'User', 'AclGroup', 'Job',
37*9c5db199SXin Li                   'AtomicGroup')
38*9c5db199SXin Li    return views_common.model_documentation(models, model_names)
39*9c5db199SXin Li
40*9c5db199SXin Li
41*9c5db199SXin Lidef redirect_with_extra_data(request, url, **kwargs):
42*9c5db199SXin Li    """Redirect according to the extra data.
43*9c5db199SXin Li
44*9c5db199SXin Li    @param request: the RPC request.
45*9c5db199SXin Li    @param url: the partial redirected url.
46*9c5db199SXin Li    @param kwargs: the parameters used in redirection.
47*9c5db199SXin Li    """
48*9c5db199SXin Li    kwargs['getdata'] = request.GET.urlencode()
49*9c5db199SXin Li    kwargs['server_name'] = request.META['SERVER_NAME']
50*9c5db199SXin Li    return HttpResponsePermanentRedirect(url % kwargs)
51*9c5db199SXin Li
52*9c5db199SXin Li
53*9c5db199SXin LiGWT_SERVER = 'http://localhost:8888/'
54*9c5db199SXin Lidef gwt_forward(request, forward_addr):
55*9c5db199SXin Li    """Get the response from forwarding address.
56*9c5db199SXin Li
57*9c5db199SXin Li    @param request: the RPC request.
58*9c5db199SXin Li    @param forward_addr: the forwarding address.
59*9c5db199SXin Li    """
60*9c5db199SXin Li    url = GWT_SERVER + forward_addr
61*9c5db199SXin Li    if len(request.POST) == 0:
62*9c5db199SXin Li        headers, content = httplib2.Http().request(url, 'GET')
63*9c5db199SXin Li    else:
64*9c5db199SXin Li        headers, content = httplib2.Http().request(url, 'POST',
65*9c5db199SXin Li                                                   body=request.body)
66*9c5db199SXin Li    http_response = HttpResponse(content)
67*9c5db199SXin Li    for header, value in headers.iteritems():
68*9c5db199SXin Li        if header not in ('connection',):
69*9c5db199SXin Li            http_response[header] = value
70*9c5db199SXin Li    return http_response
71*9c5db199SXin Li
72*9c5db199SXin Li
73*9c5db199SXin Lidef handler500(request):
74*9c5db199SXin Li    """Redirect to error website page.
75*9c5db199SXin Li
76*9c5db199SXin Li    @param request: the RPC request.
77*9c5db199SXin Li    """
78*9c5db199SXin Li    t = loader.get_template('500.html')
79*9c5db199SXin Li    trace = traceback.format_exc()
80*9c5db199SXin Li    context = Context({
81*9c5db199SXin Li        'type': sys.exc_type,
82*9c5db199SXin Li        'value': sys.exc_value,
83*9c5db199SXin Li        'traceback': cgi.escape(trace)
84*9c5db199SXin Li    })
85*9c5db199SXin Li    return HttpResponseServerError(t.render(context))
86*9c5db199SXin Li
87*9c5db199SXin Li
88*9c5db199SXin Lidef handle_file_upload(request):
89*9c5db199SXin Li    """Handler for uploading files.
90*9c5db199SXin Li
91*9c5db199SXin Li    Saves the files to /tmp and returns the resulting paths on disk.
92*9c5db199SXin Li
93*9c5db199SXin Li    @param request: request containing the file data.
94*9c5db199SXin Li
95*9c5db199SXin Li    @returns HttpResponse: with the paths of the saved files.
96*9c5db199SXin Li    """
97*9c5db199SXin Li    if request.method == 'POST':
98*9c5db199SXin Li        TEMPT_DIR = '/tmp/'
99*9c5db199SXin Li        file_paths = []
100*9c5db199SXin Li        for file_name, upload_file in request.FILES.iteritems():
101*9c5db199SXin Li            file_path = os.path.join(
102*9c5db199SXin Li                    TEMPT_DIR, '_'.join([file_name, upload_file.name]))
103*9c5db199SXin Li            with open(file_path, 'wb+') as destination:
104*9c5db199SXin Li                for chunk in upload_file.chunks():
105*9c5db199SXin Li                    destination.write(chunk)
106*9c5db199SXin Li            file_paths.append(file_path)
107*9c5db199SXin Li        return HttpResponse(rpc_utils.prepare_for_serialization(file_paths))
108