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