source: cows_wps/trunk/cows_wps/utils/metadata_utils.py @ 5615

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows_wps/trunk/cows_wps/utils/metadata_utils.py@7575
Revision 5615, 3.2 KB checked in by spascoe, 10 years ago (diff)

COWS WPS package copied from
 http://proj.badc.rl.ac.uk/svn/dcip/cows-wps/trunk.

This is a stripped down version of the DDP WPS. Some features are
removed and others have been deactivated until we reimplement them in a
more generic way.

Line 
1"""
2metadata_utils.py
3=================
4
5Some utils for handling WPS metadata.
6
7"""
8
9# Import standard library modules
10
11
12# Import local modules
13from cows_wps.utils import common
14
15def constructMetadata(context, exclusion_list=["username"], rt_type="list", 
16                      no_commas=False, truncate=False,
17                      **items):
18    """
19    Constructs a list of metadata pairs to for the metadata file.
20    rt_type defines whether the returned item is a string, list or XML structure (as a string).
21    """
22    max_len = context.config["max_len_metadata_line"]
23    if type(max_len) == str:  max_len = int(max_len)
24   
25    ordered_keys = context.config['Capabilities']["OrderedDataInputs"]
26    ordered_metadata = [(key, items[key]) for key in ordered_keys if (key not in exclusion_list and key in items.keys())]
27
28    metadata = []
29    for (key, value) in ordered_metadata:
30        skey = str(key)
31               
32        if value in (True, False):
33            value = str(value)
34
35        elif type(value) not in (str, int, float, bool):
36
37            # Special handling of list of 4 floats for bbox to ensure not too long
38            if len(value) == 4 and type(value[0]) == float:
39                svalue = ", ".join(["%.2f" % x for x in value])
40            else:
41                svalue = ", ".join([str(x) for x in value])
42
43            if truncate == True and (len(skey) * 1.1 + len(svalue)) > max_len:
44                if len(value) > 2:
45                    # This rule only makes sense if there are more than 2 items in value
46                    # Otherwise bite the bullet and display them
47                    svalue = ", ".join([str(x) for x in [value[0], "...", value[-1]]]) 
48
49            value = svalue
50
51        else:
52            value = str(value)
53            if truncate == True and (len(skey) * 1.1 + len(value)) > max_len:
54                value = value[:max_len - 4] + "..."
55
56        if no_commas == True:  value = value.replace(",", "")
57        metadata.append((skey, value))
58
59    if rt_type == "string":
60        return "; ".join(["%s: %s" % (common.titleCamelToUnderscoreLower(key, " ").title(), value) for (key,value) in metadata])
61    elif rt_type == "xml":
62        return "\n".join(["<%s>%s</%s>" % (key, value, key) for (key,value) in metadata])
63    elif rt_type == "list":
64        return metadata
65    else:
66        raise Exception("Unrecognised 'rt_type' argument: " + `rt_type`)
67
68
69if __name__ == "__main__":
70
71
72    maxLenMetadataLine = 42
73    orderedDataOutputs = ['Username', 'RequestID','Dataset','ChangeOnly',
74        'Variables','EmissionsScenarios','TimeSlices','MeaningPeriodLevel',
75        'Percentiles','LocationType','Location','BBox','ProbabilityDataType',
76        'DataOutputFormat', 'RequestDescription',] 
77
78    class c:
79        pass
80    context = c()
81    context.config = {'WpsConfig':{"max_len_metadata_line":maxLenMetadataLine},
82                      'CapabilitiesConfig':{"OrderedDataInputs":orderedDataOutputs}}
83   
84    for rt_type in ("string", "xml", "list"):
85        print constructMetadata(context, "GetData", exclusion_list=["username"], rt_type=rt_type, no_commas=True,
86                Dataset="stuff", BBox=(23, 34, 25, 23), TimeSlices=("2010-2039", "2020-2049", "2030-2059", "2040-2069", "2050-2079",
87               "2060-2089", "2070-2099")
88                )
Note: See TracBrowser for help on using the repository browser.